06. september 2004 - 14:47Der er
23 kommentarer og 1 løsning
problemer med LEFT JOIN
Hej
Jeg har en mysql sætning: select hotbilleder.* from hotbilleder LEFT JOIN profiler ON (hotbilleder.profilerID = profiler.id) LEFT JOIN blockliste ON profiler.id = blockliste.profilerID where blockliste.blockID <> '"&session("ID")&"' AND hotbilleder.godkendt = '1' AND profiler.id <> '"& session("ID") &"' and NOW() < DATE_ADD(CONCAT(SUBSTRING(profiler.onlinetime,7,4),'-',SUBSTRING(profiler.onlinetime,4,2),'-',SUBSTRING(profiler.onlinetime,1,2),' ',SUBSTRING(profiler.onlinetime,12,8)),INTERVAL 1 MINUTE) ORDER BY RAND()
Fejlen er at når jeg laver en left join på blockliste, så viser den ingenting. Det er ikke sikkert at der er noget i blockliste, så måske kan det være fejlen?
Den udskriver sql´en fint nok, men den viser bare ikke noget. Hvis jeg fjerner left join på blockliste virker det fint nok!
Håber at der er nogle der kan hjælpe, da jeg er rimelig presset og kan ikke se hvad fejlen er. På forhånd tak :o) // Rene
så tager den dem med. Det får dog ingen pragtisk betydning hvis du ikke bruger blockliste til noget. F.eks på din select liste. Så har feltet en værdi på alle dem hvor joinen passer, alle andre er NULL.
"select hotbilleder.*, blockliste.EtFelt from ...."
Prøv først med et par parenteser omkring første join:
select hotbilleder.* from ( hotbilleder LEFT JOIN profiler ON (hotbilleder.profilerID = profiler.id) ) LEFT JOIN blockliste ON profiler.id = blockliste.profilerID where blockliste.blockID <> '"&session("ID")&"' AND hotbilleder.godkendt = '1' AND profiler.id <> '"& session("ID") &"' and NOW() < DATE_ADD(CONCAT(SUBSTRING(profiler.onlinetime,7,4),'-',SUBSTRING(profiler.onlinetime,4,2),'-',SUBSTRING(profiler.onlinetime,1,2),' ',SUBSTRING(profiler.onlinetime,12,8)),INTERVAL 1 MINUTE) ORDER BY RAND()
Der var desværre ikke nogle af dem som der virkede :(
Her hvad den udskriver:
select hotbilleder.* from ( hotbilleder LEFT JOIN profiler ON (hotbilleder.profilerID = profiler.id) ) LEFT OUTER JOIN blockliste ON profiler.id = blockliste.profilerID where blockliste.blockID <> '5' AND hotbilleder.godkendt = '1' AND profiler.id <> '5' and NOW() < DATE_ADD(CONCAT(SUBSTRING(profiler.onlinetime,7,4),'-',SUBSTRING(profiler.onlinetime,4,2),'-',SUBSTRING(profiler.onlinetime,1,2),' ',SUBSTRING(profiler.onlinetime,12,8)),INTERVAL 1 MINUTE) ORDER BY RAND()
arne_v >> LEFT JOIN tager kun dem med hvor der er data at joine LEFT OUTER JOIN tager også dem med hvor man ikke kan joine, men resultatet bliver NULL
f.eks. id navn postnr 1 Anders 7000 2 Brian 8000 3 Casper NULL
"select personer.*, postBY.* from personer left outer join postBY on personer.postnr=postBY.pNR" Giver 3 resultater, men postBY.pnr og postBY.by er begge NULL for Casper.
"select personer.*, postBY.* from personer left join postBY on personer.postnr=postBY.pNR" giver 2 resustater. Casper er ikke med på listen.
tzag_dk >> Kan der være flere blockliste tilknyttet til en profil???
Det billede som man gerne vil vise, skal man ikke være på brugerens block liste. Dvs. at bruger ID fra billedet findes måske, hvis det gør ser den om blockID er lig med session("id")
arne_v >> du har dælmen ret angående INNER JOIN og LEFT JOIN.... Så jeg undskylder....
Jeg plejer faktisk kun at skrive JOIN da MSSQL (som jeg primært bruger) kan forstå det. Jeg har bare altid set at det var LEFT JOIN den skrev når jeg smed det igennem manageren, men det er det åbent bart ikke. Jeg er virkeligt forviret nu. Det er over 2 års indgroet viden, som har vist sig at være forkert......
where blockliste.blockID <> '"&session("ID")&"' AND
Til dette:
where (blockliste.blockID <> '"&session("ID")&"' or blockliste.blockID is null) AND
Så din SQL sætning bliver: select hotbilleder.* from ( hotbilleder LEFT JOIN profiler ON (hotbilleder.profilerID = profiler.id) ) LEFT JOIN blockliste ON profiler.id = blockliste.profilerID where (blockliste.blockID <> '"&session("ID")&"' or blockliste.blockID is null) AND hotbilleder.godkendt = '1' AND profiler.id <> '"& session("ID") &"' and NOW() < DATE_ADD(CONCAT(SUBSTRING(profiler.onlinetime,7,4),'-',SUBSTRING(profiler.onlinetime,4,2),'-',SUBSTRING(profiler.onlinetime,1,2),' ',SUBSTRING(profiler.onlinetime,12,8)),INTERVAL 1 MINUTE) ORDER BY RAND()
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.