Avatar billede martins Nybegynder
09. december 2004 - 11:34 Der er 8 kommentarer og
1 løsning

3 x Join - men hvordan?

Vi har brug for en supermand til sql-join. Problemet er som følger:

Vi har 3 tabeller (tests_infos,test_info,test_info_cat). I tabellen tests_infos har vi kolonnen "body", som vi gerne vil have hentet, og ydermere har vi kolonnen "catid" som skal joines til "test_info_cat.id". Som den sidste join har vi vores tabel "test_info" med kolonnen "infoid", som skal joines på vores "tests_infos.id".

Resultatet vi søger nu, er at vi uanset hvad, altid får det antal rows som ligger i test_info_cat, med tilhørende "body" (hvis det eksisterer, ellers null). Det vigtige er bare at vi altid får det samme antal rows sorteret efter "test_info_cat.id".
Avatar billede arne_v Ekspert
09. december 2004 - 12:05 #1
Prøv:

SELECT *
FROM (test_info_cat LEFT JOIN tests_infos ON test_info_cat.id=test_infos.catid)
LEFT JOIN test_info ON test_infos.infoid =test_info.id
Avatar billede martins Nybegynder
09. december 2004 - 12:16 #2
Med få tilpasninger i af vores (ret ens? :)) tabelnavne virker det perfekt. Hvis du ligger et svar, får du point. Tak for hjælpen!

Denne select kører:
SELECT  *
FROM ( test_info_cat
LEFT  JOIN tests_infos ON test_info_cat.id = tests_infos.catid )
LEFT  JOIN test_info ON test_info.infoid = tests_infos.id
Avatar billede arne_v Ekspert
09. december 2004 - 12:19 #3
svar
Avatar billede martins Nybegynder
09. december 2004 - 12:22 #4
Uha det ser ikke helt ud til at virke alligevel. Hvis vi sætter en WHERE klausul på, finder den kun de poster der ikke er null. Det vi prøver er følgende:

SELECT tests_infos.body FROM (test_info_cat LEFT JOIN tests_infos ON test_info_cat.id = tests_infos.catid) LEFT JOIN test_info ON test_info.infoid = tests_infos.id WHERE test_info.testid = 1;
Avatar billede arne_v Ekspert
09. december 2004 - 12:37 #5
Prøv:

SELECT tests_infos.body FROM (test_info_cat LEFT JOIN tests_infos ON test_info_cat.id = tests_infos.catid) LEFT JOIN test_info ON test_info.infoid = tests_infos.id AND test_info.testid = 1;
Avatar billede martins Nybegynder
09. december 2004 - 12:47 #6
Så finder den godt nok alle resultaterne fra test_info_cat, men en af dem skal være null, da den er tilknyttet i test_info.
Avatar billede martins Nybegynder
09. december 2004 - 12:48 #7
"da den er tilknyttet i test_info" skulle selvf. være "da den IKKE er tilknyttet i test_info".
Avatar billede arne_v Ekspert
09. december 2004 - 21:05 #8
Ikke forstået
Avatar billede martins Nybegynder
11. december 2004 - 12:37 #9
Ved WHERE finder den ikke den der ikke eksisterer i test_info og ved AND vælger den alle der eksisterer i tests_infos. Den skulle gerne vælge alle poster i tests_infos og erstatte den der ikke eksisterer i test_info med et null.
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
Computerworld tilbyder specialiserede kurser i database-management

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