trondes Skrevet 10. mars 2006 Del Skrevet 10. mars 2006 Hvis jeg henter ut data fra to tabeler feks: SELECT b.navn, b.login, l.beskrivelse, l.tid_reg FROM bruker AS b, log AS l WHERE b.bruker_id = l.bruker_id LIMIT 0,10 Men hvis jeg kjører denne queryen får jeg bare noe tilbake hvis det er noe i "log" tabelen som passer også. Det jeg hadde ønsket var at jeg også fikktilbake hvis det ikke var noe i "log" tabelen som passet. Er dette mulig? Lenke til kommentar
roac Skrevet 10. mars 2006 Del Skrevet 10. mars 2006 Hvis jeg henter ut data fra to tabeler feks: SELECT b.navn, b.login, l.beskrivelse, l.tid_reg FROM bruker AS b, log AS l WHERE b.bruker_id = l.bruker_id LIMIT 0,10 Men hvis jeg kjører denne queryen får jeg bare noe tilbake hvis det er noe i "log" tabelen som passer også. Det jeg hadde ønsket var at jeg også fikktilbake hvis det ikke var noe i "log" tabelen som passet. Er dette mulig? 5732856[/snapback] Spørringen du har nå er en inner join og kan (med fordel) også skrives som inner join: SELECT b.navn, b.login, l.beskrivelse, l.tid_reg FROM bruker AS b inner join log AS l ON b.bruker_id = l.bruker_id LIMIT 0, 10 (Litt usikker på LIMIT her, siden det er MySQL spesifikt) Det du ønsker er en outer join: SELECT b.navn, b.login, l.beskrivelse, l.tid_reg LEFT OUTER JOIN bruker AS b inner join log AS l ON b.bruker_id = l.bruker_id LIMIT 0, 10 Lenke til kommentar
trondes Skrevet 10. mars 2006 Forfatter Del Skrevet 10. mars 2006 Hvis jeg henter ut data fra to tabeler feks: SELECT b.navn, b.login, l.beskrivelse, l.tid_reg FROM bruker AS b, log AS l WHERE b.bruker_id = l.bruker_id LIMIT 0,10 Men hvis jeg kjører denne queryen får jeg bare noe tilbake hvis det er noe i "log" tabelen som passer også. Det jeg hadde ønsket var at jeg også fikktilbake hvis det ikke var noe i "log" tabelen som passet. Er dette mulig? 5732856[/snapback] Spørringen du har nå er en inner join og kan (med fordel) også skrives som inner join: SELECT b.navn, b.login, l.beskrivelse, l.tid_reg FROM bruker AS b inner join log AS l ON b.bruker_id = l.bruker_id LIMIT 0, 10 (Litt usikker på LIMIT her, siden det er MySQL spesifikt) Det du ønsker er en outer join: SELECT b.navn, b.login, l.beskrivelse, l.tid_reg LEFT OUTER JOIN bruker AS b inner join log AS l ON b.bruker_id = l.bruker_id LIMIT 0, 10 5732916[/snapback] med andre ord; hvis jeg bruker "hoved" tabelen som outer, og evt. andre tabeler som inner vil jeg alltid få data fra minst "hoved" tabelen og hvis det er noe som passer i de andre tabelene får jeg det også? Eller kanskje jeg har missforstått litt her Lenke til kommentar
roac Skrevet 10. mars 2006 Del Skrevet 10. mars 2006 (endret) med andre ord; hvis jeg bruker "hoved" tabelen som outer, og evt. andre tabeler som inner vil jeg alltid få data fra minst "hoved" tabelen og hvis det er noe som passer i de andre tabelene får jeg det også? Eller kanskje jeg har missforstått litt her 5733025[/snapback] Du vil alltid få med data som er på "outer" siden. Merk at det ikke er noen begrensning på antall ytre joins. Så du kan tenke deg følgende: select a.noe, b.noe, c.noe, d.noe, e.noe from a left outer join b on (a.bid = b.bid) left outer join c on (a.cid = c.cid) left outer join d on (c.did = d.did) full outer join e on (a.eid = e.eid) Altså: Dersom det er data i a vil du alltid få med dataene her, uansett om det er tilhørende data i b eller c. Dersom det er data i c med tilhørende data i a, vil du alltid få med dataene fra c, uavhengig av om deet er data i d som hører til c eller ikke. Men, evt data i e vil du alltid få med. Merk at du har både right, left og full (både left og right) outer joins til rådighet. Endret 10. mars 2006 av roac Lenke til kommentar
trondes Skrevet 10. mars 2006 Forfatter Del Skrevet 10. mars 2006 (endret) select a.noe, b.noe, c.noe, d.noe, e.noe from a left outer join b on (a.bid = b.bid) left outer join c on (a.cid = c.cid) left outer join d on (c.did = d.did) full outer join e on (a.eid = e.eid) Altså: Dersom det er data i a vil du alltid få med dataene her, uansett om det er tilhørende data i b eller c. Dersom det er data i c med tilhørende data i a, vil du alltid få med dataene fra c, uavhengig av om deet er data i d som hører til c eller ikke. Men, evt data i e vil du alltid få med. Merk at du har både right, left og full (både left og right) outer joins til rådighet. Altså når det blir brukt "left" betyr det at det som er på venstre side av "=" er referanse strengen som skal passe med noe i den andre tabelen. ok.. hmm.. hvorfor har jeg ikke lært meg dette tidligere, vil nå spare en god del spørringer takk Men med "full" vil de si at hvis vi skriver a.cid = b.cid så vil den første prøve å finne a.cid i b tabelen og etter på b.cid i a tabelen ? Er det ikke mulig å bruke queryen slik: select a.noe, b.noe, c.noe, d.noe, e.noe from a left outer join b, left outer join c, left outer join d Where a.bid = b.bid AND a.cid = c.cid AND a.did = d.did Spørrer bare jeg Endret 10. mars 2006 av trondes Lenke til kommentar
roac Skrevet 10. mars 2006 Del Skrevet 10. mars 2006 Ang full join tror jeg dette skal være det du treger for å få oversikt over hvordan de forskjellige typene joins fungerer. Jeg har ikke MySQL tilgjengelig her, men denne koden vil (med noen små modifikasjoner) fungere helt fint på Microsoft SQL Server, og bruker kun standard SQL kode: create table a ( id int, noe char(10) ); create table b ( id int, noe char(10) ); insert into a values (1,'noe a 1'); insert into b values (1,'noe b 1'); insert into a values (2,'noe a 2'); insert into b values (3,'noe b 3'); -- Inner join select a.noe, b.noe from a inner join b on (a.id = b.id); -- Left outer join select a.noe, b.noe from a left outer join b on (a.id = b.id); -- Right outer join select a.noe, b.noe from a right outer join b on (a.id = b.id); -- Full outer join select a.noe, b.noe from a full outer join b on (a.id = b.id); Lenke til kommentar
trondes Skrevet 10. mars 2006 Forfatter Del Skrevet 10. mars 2006 Ang full join tror jeg dette skal være det du treger for å få oversikt over hvordan de forskjellige typene joins fungerer. Jeg har ikke MySQL tilgjengelig her, men denne koden vil (med noen små modifikasjoner) fungere helt fint på Microsoft SQL Server, og bruker kun standard SQL kode: Der ja.. da ble ting litt lysere.. fikk ikke full til å virke, kanskje ikke MySQL støtter det? men forsto de andre nå.. ha en fortsatt fin dag Lenke til kommentar
Sindre Skrevet 13. mars 2006 Del Skrevet 13. mars 2006 Det er korrekt "full outer join" er ikke støttet av Mysql enda Lenke til kommentar
roac Skrevet 13. mars 2006 Del Skrevet 13. mars 2006 Det er korrekt "full outer join" er ikke støttet av Mysql enda 5746235[/snapback] da må man ty til en reserveløsning da: select a.noe, b.noe from a left outer join on (a.aid = b.aid) union select null, b.noe from b where b.aid is null; Dette vil gi det samme resultatet: 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å