webForumDet fria alternativet

inner join och flera vilkor

Databaser & SQL

5 svar · 392 visningar · startad av peppar

Medlem sedan dec. 2001873 inlägg
Frågan#1

Jag kan för mitt liv inte begripa mig på join. Jag har nu försökt att använda en SQL-designer men det har hittils gått åt fanken.
Jag har en fråga mot en databas som ser ut såhär:

SELECT art_pages.*, art_typ.*, art_artiklar.*, medlemsregister.*"&_
"  FROM medlemsregister "&_
"INNER JOIN (art_typ INNER JOIN (art_artiklar INNER JOIN art_pages "&_
"    ON art_artiklar.artId = art_pages.pagArtOrigin) ON art_typ.typId = art_artiklar.artTyp) ON medlemsregister.usrId = art_artiklar.artUsrID "&_
" WHERE art_pages.pagSida = 'nyheter' AND art_typ.typTyp = 'nyhet';

Nu vill jag hämta alla fälten art_bilder.* och med vilkoret

where art_bilder.bldParent = art_artiklar.artId

Jag knåpade ihop en variant som ser ut såhär:

SELECT art_pages.*,art_typ.*,art_artiklar.*,art_bilder.*,medlemsregister.*"&_
  			" FROM (((art_artiklar INNER JOIN art_pages ON art_artiklar.artId = art_pages.pagArtOrigin) INNER JOIN art_typ ON art_typ.typId = art_artiklar.artTyp) INNER JOIN medlemsregister ON medlemsregister.usrId = art_artiklar.artUsrID) INNER JOIN art_bilder ON art_bilder.bldParent = art_artiklar.artId WHERE art_pages.pagSida = 'nyheter' AND art_typ.typTyp = 'nyhet';

Men då fungerar inte vilkoren i slutet? Hur får jag in mina fält från art-bilder tabellen i den övre frågan?

Medlem sedan dec. 2001873 inlägg
#2

Den nedersta frågan fungerar ju alldeles utmärkt men det som blir fel är att den inte returnerar något alls om det inte finns någon post i art_bild tabellen som är relaterad till art_arikel.artID... den bör den ju göra...?!

Medlem sedan juni 200032 967 inlägg
#3

den bör den ju göra...?!

Nej, det bör den inte. Du har ju inner joins hela vägen, då kräver du ju att data ska finnas i alla tabeller. Byt till LEFT JOIN där du inte kräver att data ska finnas, och flytta villkoren från WHERE-satsen till JOIN-instruktionen.

Medlem sedan dec. 2001873 inlägg
#4

Mmm?! Har provat lite... denna ger mig syntax fel, operator saknas...

SELECT art_pages.*,art_typ.*,art_artiklar.*,art_bilder.*,medlemsregister.* "&_
				"FROM (((art_artiklar "&_
				"INNER JOIN art_pages "&_
				"ON art_artiklar.artId = art_pages.pagArtOrigin) "&_
				"INNER JOIN art_typ "&_
				"ON art_typ.typId = art_artiklar.artTyp) "&_
				"INNER JOIN medlemsregister "&_
				"ON medlemsregister.usrId = art_artiklar.artUsrID) "&_
				"WHERE art_pages.pagSida = 'default' AND art_typ.typTyp = 'artikel' "&_
				"LEFT JOIN art_bilder "&_
				"ON art_bilder.bldParent = art_artiklar.artId
Medlem sedan dec. 2001873 inlägg
#5

Nej med detta fungerar:

"SELECT art_pages.*,art_typ.*,art_artiklar.*,art_bilder.*,medlemsregister.* "&_
				"FROM (((art_artiklar "&_
				"INNER JOIN art_pages "&_
				"ON art_artiklar.artId = art_pages.pagArtOrigin) "&_
				"INNER JOIN art_typ "&_
				"ON art_typ.typId = art_artiklar.artTyp) "&_
				"INNER JOIN medlemsregister "&_
				"ON medlemsregister.usrId = art_artiklar.artUsrID) "&_
				"LEFT JOIN art_bilder "&_
				"ON art_bilder.bldParent = art_artiklar.artId "&_
				"WHERE art_pages.pagSida = 'default' AND art_typ.typTyp = 'artikel';"
Medlem sedan dec. 2001873 inlägg
#6

Jag kan för mitt liv inte begripa JOINs. Nu har jag lite hum om INNER och LEFT JOIN i vart fall... ;)

271 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
138 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
134 ms — ändringar (db)