Avatar billede tzag_dk Nybegynder
06. september 2004 - 14:47 Der 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
Avatar billede fennec Nybegynder
06. september 2004 - 14:58 #1
LEFT OUTER JOIN blockliste

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 ...."
Avatar billede arne_v Ekspert
06. september 2004 - 15:00 #2
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()
Avatar billede arne_v Ekspert
06. september 2004 - 15:03 #3
Jeg mener ikke at der er nogen forskel på LEFT JOIN og LEFT OUTER JOIN
Avatar billede tzag_dk Nybegynder
06. september 2004 - 15:07 #4
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()
Avatar billede arne_v Ekspert
06. september 2004 - 15:14 #5
Hvilken fejl får du ?
Avatar billede tzag_dk Nybegynder
06. september 2004 - 15:18 #6
Det er det som der er problemet, jeg får ikke noget fejl. Den viser bare ikke noget :-(

Det er egentlig en forsættelse til den her:
http://www.eksperten.dk/spm/497248
Avatar billede fennec Nybegynder
06. september 2004 - 15:20 #7
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???
Avatar billede tzag_dk Nybegynder
06. september 2004 - 15:23 #8
Ja, den er opbygger sådan her:

id--profilerID--blockID
------------------------
1---1-----------56
2---34----------45
3---3-----------56
4---1-----------74

profilerID = RS("id")
blockID = session("id")
Avatar billede arne_v Ekspert
06. september 2004 - 15:24 #9
fennec>

Er det ikke INNER JOIN og LEFT JOIN du illusterer der ?
Avatar billede arne_v Ekspert
06. september 2004 - 15:29 #10
Avatar billede tzag_dk Nybegynder
06. september 2004 - 15:30 #11
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")
Avatar billede tzag_dk Nybegynder
06. september 2004 - 15:33 #12
arne_v >> Det hjalp heller ikke noget at ændre det :o(

Damm
Avatar billede arne_v Ekspert
06. september 2004 - 15:45 #13
og http://archives.neohapsis.com/archives/mysql/2004-q1/1728.html

tzag>

Det ved jeg. Men jeg vil bare gerne sikre mig at vi undgår "myter".

Ingen fejl. Hm. Har du prøvet at teste SQL sætningen i PHPMyAdmin ?
Avatar billede arne_v Ekspert
06. september 2004 - 15:46 #14
Med og uden den sidste LEFT JOIN.

Fordi en LEFT JOIN bør aldrig give færre rækker.
Avatar billede tzag_dk Nybegynder
06. september 2004 - 15:47 #15
Tester lige i phpMyAdmin...
Avatar billede tzag_dk Nybegynder
06. september 2004 - 15:52 #16
Med den sidste left join, laver den ingen fejl. Men kommer ikke med nogle resultater.
Og tabellen blockliste er tom.

Uden den sidste left join, laver den ingen fejl. Og kommer med 3 resultater.
Avatar billede fennec Nybegynder
06. september 2004 - 15:55 #17
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......
Avatar billede eagleeye Praktikant
06. september 2004 - 17:26 #18
Prøv at rette :

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()
Avatar billede tzag_dk Nybegynder
06. september 2004 - 17:29 #19
Ok, jeg prøver lige.
I mellem tiden, kan du så ikke kikke på det her?
http://www.eksperten.dk/spm/536827
Avatar billede tzag_dk Nybegynder
06. september 2004 - 17:34 #20
Det virker jo bare som det skal!

Tak for det :o)
Lig et svar....!
Avatar billede eagleeye Praktikant
06. september 2004 - 17:52 #21
Ok ;)
Avatar billede tzag_dk Nybegynder
06. september 2004 - 17:53 #22
:o)
Avatar billede arne_v Ekspert
06. september 2004 - 18:53 #23
Man skal vist lære at læse SQL'en grundigt og ikke stole på
det der bliver skrevet.

:-)
Avatar billede tzag_dk Nybegynder
06. september 2004 - 18:54 #24
Hvad mener du?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester