Gå til innhold

Anbefalte innlegg

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

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

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