Gå til innhold

Konvertere en spørring over til "join" spørring.


Anbefalte innlegg

SELECT 
	t1.id, 
	t1.timestamp, 
	t1.uid, 
	t1.what, 
	t1.ip, 
	t1.ekstra, 

	t2.id AS uid, 
	t2.fornavn, 
	t2.mellomnavn, 
	t2.etternavn 

	FROM 
	logg AS t1, 
	brukere AS t2 

	WHERE t1.uid = t2.id ORDER BY t1.id DESC LIMIT 300;

 

Har denne spørringen i starten på et PHP script som henter ut en logg.

 

Problemet oppstår hvis t1.uid ikke eksisterer som t2.id, jeg ville helst da bare fått ut blankt resultat.

 

Har aldri forstått logikken i join, kan noen forklare/vise hvordan dette kan/skal gjøres?

 

Jeg lurer også på hvordan join er mulig i spørringer som involverer tre eller flere tabeller, fint om noen kunne vist meg noen eksempler.

Lenke til kommentar
Videoannonse
Annonse

Prøv denne:


SELECT 
       t1.id, 
       t1.timestamp, 
       t1.uid, 
       t1.what, 
       t1.ip, 
       t1.ekstra, 

       t2.id AS uid, 
       t2.fornavn, 
       t2.mellomnavn, 
       t2.etternavn 

       FROM 
       logg AS t1, 
       brukere AS t2 

      INNER JOIN t1 ON t1.uid = t2.id ORDER BY t1.id DESC LIMIT 300;

Ser nå idag at det er feil i spørringen, min feil inatt. Jeg var trøtt :/

Endret av Gjest
Lenke til kommentar
Jeg lurer også på hvordan join er mulig i spørringer som involverer tre eller flere tabeller, fint om noen kunne vist meg noen eksempler.

SELECT a.felt1, a.felt2, b.felt3, b.felt4, c.felt5, <snip> z.felt100
FROM tabell1 a
INNER JOIN tabell2 b ON a.id=b.id
INNER JOIN tabell3 c ON a.id=c.id
INNER JOIN tabell4 d ON c.zxy=d.abc
<snip>
INNER JOIN tabellx z ON a.id=z.id
WHERE ...
ORDER BY ...

Edit2: Må ikke være samme join, i dette tilfellet INNER JOIN, hele veien, kan selvfølgelig bruke det som er hensiktsmessig ;) Hvordan man kobler tabellene i ON delen kan også variere en del, jeg brukte kun noe helt enkelt.

 

http://www.w3schools.com/SQl/sql_join_inner.asp

http://www.w3schools.com/sql/sql_join.asp

http://en.wikipedia.org/wiki/Join_(SQL)

(google søk på sql joins)

LEFT JOIN: Return all rows from the left table, even if there are no matches in the right table

 

RIGHT JOIN: Return all rows from the right table, even if there are no matches in the left table

 

The INNER JOIN keyword return rows when there is at least one match in both tables.

 

An outer join does not require each record in the two joined tables to have a matching record. The joined table retains each record—even if no other matching record exists.

Er ikke helt stødig i alle join varianter. Kan anbefale Learning SQL fra O'Reilly (du kan lese deler av boken på denne linken). Den bruker mysql i eksemplene, men viser også hvordan det gjøres i (i alle fall) MS Sql og Oracle i tillegg der hvor det er avvik mellom databasene.

 

Edit:

Hadde ikke lest første posten helt, rettet mest på ColdIce ;), for slik du har skrevet select'en din så er det tilsvarende en INNER JOIN. Du er nødt til å bruker LEFT JOIN når du vil

Problemet oppstår hvis t1.uid ikke eksisterer som t2.id, jeg ville helst da bare fått ut blankt resultat.

som du selv oppdaget. Alternativt RIGHT JOIN hvis tabellene hadde vært i motsatt rekkefølge.

Endret av Crowly
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...