Gå til innhold

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


Anbefalte innlegg

Skrevet (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 av petterg
Videoannonse
Annonse
Skrevet

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å.

Skrevet

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?

Skrevet

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;

Skrevet

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.

Skrevet

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?

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...