24. april 2006 - 20:23Der er
36 kommentarer og 1 løsning
Union virker ikke.. nogle forslag?
jeg har nedenstående kode som skal hente nogle oplysninger fra 4 identiske tabeller.. ved godt at 4 ens tabeller ikke altid er optimalt;) men hvordan får jeg nedenstående til at virke, for koden virker perfekt hvis jeg kun henter fra én tabel?
$query = mysql_query(" SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM salgAfProdukt
UNION SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM koebAfProdukt
UNION SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM bytteAfProdukt
UNION SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM bortgivesAfProdukt
AS s
INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
og hvorfor kan man ikke bare gøre som nedenstående:
$query = mysql_query(" (SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM salgAfProdukt
UNION
koebAfProdukt
UNION
bytteAfProdukt
UNION
bortgivesAfProdukt)
AS s
INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
Har nu prøvet med lidt paranteser, men det virker stadig ikke :(
$query = mysql_query(" (SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM salgAfProdukt)
UNION (SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM koebAfProdukt)
UNION (SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM bytteAfProdukt)
UNION (SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM bortgivesAfProdukt)
AS s
INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
naar du ikke vil fortaelle hvad du mener saa maa jeg jo gaette
jeg gaetter paa at du mener
( (SELECT ...) UNION (SELECT ...) UNION (SELECT ...) ) JOIN ...
hvis det er korrekt saa proev:
$query = mysql_query("SELECT * FROM ( (SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM salgAfProdukt)
UNION (SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM koebAfProdukt)
UNION (SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM bytteAfProdukt)
UNION (SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM bortgivesAfProdukt) ) s
INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
Nu skal jeg så prøve at forklare mig lidt bedre:) jeg har nedenstående som henter nogle oplysninger fra én tabel hvilket også virker glimrende.. mit problem er at jeg har 4 identiske tabeller, og jeg ville nu gerne have scriptet til at hente oplysninger fra alle 4 på én gang.. håber det hjalp:)
$query = mysql_query(" SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM salgAfProdukt AS s INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT u.userEmail, s.loebetidForAnnonce, s.produkt
Bemærk at dette virker fint.. så det med u. s. s. er vist ok.. Ikke? men nedenstående virker jo bare kun på én tabel.
$query = mysql_query(" SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM salgAfProdukt AS s INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
Nej, det er ikke ok i din union af 4 select-sætninger, bare fordi det virker i en enkelt join. Der findes ingen u tabel i de "indre" select-sætninger. Så væk med s og u.
Desuden skal du finde felterne de rigtige steder. Prøv lige den her (og du må ikke ændre i den)
$query = mysql_query("SELECT * FROM ( (SELECT userId, loebetidForAnnonce, produkt FROM salgAfProdukt) UNION (SELECT userId, loebetidForAnnonce, produkt FROM koebAfProdukt)
UNION (SELECT userId, loebetidForAnnonce, produkt FROM bytteAfProdukt)
UNION (SELECT userId, loebetidForAnnonce, produkt FROM bortgivesAfProdukt) ) s
INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
jeg ændrede lige s til AS s, hvis du ved hvor jeg mener:) men får stadig en fejlmedd.
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT userId, loebetidForAnnonce, produkt FROM
$query = mysql_query(" SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM (salgAfProdukt, koebAfProdukt, bytteAfProdukt, bortgivesAfProdukt) AS s INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
Det er tænkeligt at det skal være en kende simplere:
$query = mysql_query("( (SELECT userId, loebetidForAnnonce, produkt FROM salgAfProdukt) UNION (SELECT userId, loebetidForAnnonce, produkt FROM koebAfProdukt)
UNION (SELECT userId, loebetidForAnnonce, produkt FROM bytteAfProdukt)
UNION (SELECT userId, loebetidForAnnonce, produkt FROM bortgivesAfProdukt) ) s
INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
det er fordi en bruger kan oprette annoncer i flere tabeller.. hvis han fx har annoncer i 2 af tabellerne skal han ikke modtage 2 mails kun én, så derfor..
Nej, det er altså ikke forklaring på din GROUP BY. Det er jo ikke bare noget man sætter på for sjov, fordi mysql så kan gætte hvad du vil. Hvad er det du vil opnå med den? Hvilket resultat - gerne et eksempel.
Så kan vi nok, måske, komme op med noget der virker i mysql 4.1 - men jeg kan ikke i mysql 4.0, desværre.
Jeg kan sikkert i mysql 4.0 hvis du smider de 4 tabeller sammen i een.
Jeg kan desværre ikke ændre min mySql version:( og jeg kan ikke samle de 4 tabeller i én:( og som det er nu virker nedenstående kode, men kun når den skal arbejde med én tabel. Hva fann gør jeg så?
$query = mysql_query(" SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM salgAfProdukt AS s INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
") or die(mysql_error());
if (mysql_num_rows($query) > 0) { $subject = 'Annoncer udløber på xxx.dk'; $headers = 'From: robot@xxx.dk' . "\n" . //skal være en xxx.dk mailadresse, ellers kan den maks sende 1 mail pr. minut. 'Reply-To: From: robot@xxx.dk' . "\n" . 'X-Mailer: PHP/' . phpversion();
while($row = mysql_fetch_assoc($query)) { $to = $row['userEmail']; $message = 'Du har annoncer på xxx.dks hjemmeside, som udløber inden for de næste dage. Du kan forlænge dine annoncers løbetid hvis du logger ind på hjemmesiden og går ind under "Min konto", ellers vil de blive slettet ved udløb.' . "\n\n"; $message .= 'Med venlig hilsen xxx.dk' . "\n\n\n"; $message .= '------------------------------------------' . "\n"; $message .= 'PS: denne email er udsendt automatisk og kan derfor ikke besvares. Benyt i stedet kontaktmulighederne på xxx.dk' . "\n";
og burde man egentlig ikke kunne løse det således?
$query = mysql_query("SELECT * FROM( SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM salgAfProdukt AS s INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW())
UNION ( SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM koebAfProdukt AS s INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW())
UNION ( SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM bytteAfProdukt AS s INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW())
UNION ( SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM bortgivesAfProdukt AS s INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW())
Men kan godt forstå hvis du ikke gider mere.. Det er ikke en af de nemme, indrømmet:). Hvis det er, er du velkommen til at smide et svar så du kan få dine point. Jeg kan også sætte dem lidt op hvis det hjælper?
ja. Nedenstående virker, men kun på én tabel.. Skal bare virke så den kan hente fra 4 tabeller på én gang, eller hvordan man nu kan gøre det:)
$query = mysql_query(" SELECT u.userEmail, s.loebetidForAnnonce, s.produkt FROM salgAfProdukt AS s INNER JOIN userProfile AS u ON u.userId = s.userId WHERE ADDDATE(s.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(s.loebetidForAnnonce, INTERVAL -4 DAY) > NOW() GROUP BY u.userEmail
") or die(mysql_error());
if (mysql_num_rows($query) > 0) { $subject = 'Annoncer udløber på xxx.dk'; $headers = 'From: robot@xxx.dk' . "\n" . //skal være en xxx.dk mailadresse, ellers kan den maks sende 1 mail pr. minut. 'Reply-To: From: robot@xxx.dk' . "\n" . 'X-Mailer: PHP/' . phpversion();
while($row = mysql_fetch_assoc($query)) { $to = $row['userEmail']; $message = 'Du har annoncer på xxx.dks hjemmeside, som udløber inden for de næste dage. Du kan forlænge dine annoncers løbetid hvis du logger ind på hjemmesiden og går ind under "Min konto", ellers vil de blive slettet ved udløb.' . "\n\n"; $message .= 'Med venlig hilsen xxx.dk' . "\n\n\n"; $message .= '------------------------------------------' . "\n"; $message .= 'PS: denne email er udsendt automatisk og kan derfor ikke besvares. Benyt i stedet kontaktmulighederne på xxx.dk' . "\n";
Det var bare en tanke men hvis union ikke virker kunne man måske "vende" det om og lave left join ud fra userProfile eks:
$query = mysql_query(" SELECT userEmail FROM (((userProfile as u LEFT JOIN salgAfProdukt as t1 ON u.id = t1.userId) LEFT JOIN koebAfProdukt as t2 ON u.id = t2.userId) LEFT JOIN bytteAfProdukt as t3 ON u.id = t3.userId) LEFT JOIN bortgivesAfProdukt as t4 ON u.id = t4.userId WHERE (ADDDATE(t1.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(t1.loebetidForAnnonce, INTERVAL -4 DAY) > NOW()) OR (ADDDATE(t2.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(t2.loebetidForAnnonce, INTERVAL -4 DAY) > NOW()) OR (ADDDATE(t3.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(t3.loebetidForAnnonce, INTERVAL -4 DAY) > NOW()) OR (ADDDATE(t4.loebetidForAnnonce, INTERVAL -5 DAY) < NOW() AND ADDDATE(t4.loebetidForAnnonce, INTERVAL -4 DAY) > NOW()) ") or die(mysql_error());
hehe.. det ser jo helt vandvittigt ud.. kan desværre ikke nå at teste det i aften, der presses fra anden side.. men prøver lige i morgen.. skal nok vende tilbage..:) nat nat
ok.. men tak for hjælpen.. så snupper jeg da pointene selv
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.