petterg Skrevet 19. februar 2005 Del Skrevet 19. februar 2005 (endret) Det er noen år siden sist jeg holdt på med mysql, så jeg trenger hjelp til en spørring. Har to tabeller, A og B. I tabell A er id primær nøkkel. I tabell B er aId og cId primær nøkler. (har også en tabell C, men den trengs ikke nå.) Tabell A: [b]id , tekstA[/b] 1 , en 2 , to 3 , tre 4 , fire Tabell B: [b]aid , cId , tekstB[/b] 1 , 1 , a 2 , 2 , b 1 , 2 , c 3 , 4 , d Jeg ønsker så å liste alle rader i tabell A med feltene A.id, A.tekstA og B.tekstB. Hvis det finnes en matchende rad i B som har cId=2 skal tilhørende tekstB tas med, ellers skal tekstB være blank. Radene i A skal bare tas med en gang. Ønsket resultat er altså: [b]id, tekstA, tekstB[/b] 1 , en , c 2 , to , b 3 , tre , 4 , fire , Det nærmeste jeg har kommet ønsket resultat er: SELECT A.id, A.tekstA, B.tekstB FROM A, B WHERE A.id=B.aId AND B.cId=2; (evt utelate AND B.cId=2 på slutten) som gir: [b]id, tekstA, tekstB[/b] (1 , en , a) 1 , en , c 2 , to , b (3 , tre , d) Eller SELECT A.id, A.tekstA, B.tekstB FROM A LEFT JOIN B ON A.id=B.aId; som gir: [b]id, tekstA, tekstB[/b] 1 , en , a 1 , en , c 2 , to , b 3 , tre , d 4 , fire , Noen forslag til hvordan dette kan gjøres? Endret 21. februar 2005 av petterg Lenke til kommentar
kaffenils Skrevet 19. februar 2005 Del Skrevet 19. februar 2005 Du var nesten i mål. Som du selv sier så gir: Eller SELECT A.id, A.tekstA, B.tekstB FROM A LEFT JOIN B ON A.id=B.aId; som gir: [b]id, tekstA, tekstB[/b] 1 , en , a 1 , en , c 2 , to , b 3 , tre , d 4 , fire , Her har du ikke tatt med at cId skal være 2. Siden du bruker left join mot tabell B, og du samtidig skal sette et filter på tabell B må du bruke følgende SQL: SELECT A.id, A.tekstA, B.tekstB FROM A LEFT JOIN B ON A.id=B.aId where B.cId=2 or B.cID is null; at du må bruke B.cId=2 er jo logisk nok, men siden du bruker left join mot tabell B så vil cId være NULL hvis det ikke finnes noen matchende rad, og du vil jo ha med disse også. Lenke til kommentar
petterg Skrevet 20. februar 2005 Forfatter Del Skrevet 20. februar 2005 Den er litt mer nesten enn de jeg hadde satt opp... den tar ikke med raden med A.id=3. Jeg skal altså ha alle linjer fra A. Mulig jeg må inn med temparary tabels for dette? Lenke til kommentar
petterg Skrevet 21. februar 2005 Forfatter Del Skrevet 21. februar 2005 Har funnet en løsning med temporary table og 4 queries. Håper likevel at noen vet om en måte å gjøre dette på, uten å bruke temporary table. create temporary table temp SELECT A.id, A.tekstA, B.tekstB FROM A LEFT JOIN B ON A.id=B.aId where B.cId=2; alter table temp add primary key (id); insert ignore into temp select id, tekstA, null as tekstB FROM A; select * from temp; Lenke til kommentar
kaffenils Skrevet 21. februar 2005 Del Skrevet 21. februar 2005 SELECT dbo.A.id, dbo.A.tekstA, dbo.B.tekstB FROM dbo.A LEFT OUTER JOIN dbo.B ON dbo.A.id = dbo.B.aid AND dbo.B.cid = 2 Det var vi i mål. Lenke til kommentar
petterg Skrevet 21. februar 2005 Forfatter Del Skrevet 21. februar 2005 Perfekt. Mange takk! Står i dok at ON reglene ikke skal brukes til å begrense utvalget, men det var tydligvis det som trengtes her. Hva er forøvrig forskjellen på LEFT OUTER JOIN og LEFT JOIN? Lenke til kommentar
kaffenils Skrevet 21. februar 2005 Del Skrevet 21. februar 2005 Hva er forøvrig forskjellen på LEFT OUTER JOIN og LEFT JOIN? Det gjør ingen forskjell om du tar med OUTER eller ikke. Lenke til kommentar
petterg Skrevet 21. februar 2005 Forfatter Del Skrevet 21. februar 2005 Mange takk for hjelpa! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå