Gå til innhold

[LØST:] MySQL: select, join query


Anbefalte innlegg

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 av petterg
Lenke til kommentar
Videoannonse
Annonse

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...