webForumDet fria alternativet

Kan vara NULL

11 svar · 593 visningar · startad av Web-Tor

Web-TorMedlem sedan nov. 200013 890 inlägg
#1

I tabellen "products" har jag bl.a. ett fält som heter "coll". Detta värde matchas mot tabellen "collections_desc" där resten av datan hämtas:

SELECT * FROM products,collections_desc WHERE products.id='.$prodID.' AND collections_desc.id = products.coll

Nu visar det sig att "coll" ibland kan vara tomt (NULL). Då finns det ju inte någon att hämta i "collections_desc" vilket resulterar i fel. Hur löser man det?

überfuzzMedlem sedan apr. 2006409 inlägg
#2

Använd LEFT JOIN, då får du även med tomma celler.

TroxyMedlem sedan mars 20041 505 inlägg
#3

Tänkte fel.

Peter SMedlem sedan dec. 20025 483 inlägg
#4

Ett tillägg überfuzz förslag: villkoret collections_desc.id = products.coll flyttas från WHERE och blir ditt kommande left join-villkor.

Web-TorMedlem sedan nov. 200013 890 inlägg
#5

überfuzz skrev:

Använd LEFT JOIN, då får du även med tomma celler.

Har du lust att visa var i SQL-frågan man skall stänga in det?

Peter SMedlem sedan dec. 20025 483 inlägg
#6
SELECT *
  FROM products
LEFT
  JOIN collections_desc
    ON collections_desc.id = products.coll
 WHERE products.id='.$prodID.'
Web-TorMedlem sedan nov. 200013 890 inlägg
#7

Det där funkade ju kalas!

Hur gör jag om jag vill ha ytterligare krav på collections_desc?
Där finns en "lang"-kolumn som måste innehålla ett visst värde (t.ex "sv").

/r Glöm det. Det är ju bara att lägga till AND...

überfuzzMedlem sedan apr. 2006409 inlägg
#8

Web-Tor skrev:

Har du lust att visa var i SQL-frågan man skall stänga in det?

Nu fick du queryn av Peter ser jag. Jag trodde att du fastnade på vilken typ av join som hämtar tomma rader. Tål att läsas om ifall du inte vet hur de fungerar.

Web-TorMedlem sedan nov. 200013 890 inlägg
#9

Nu har jag stött på ett nytt problem. I samband med den här SQL-frågan vill jag också ha ut viss data från tabellen "products_desc" (här ligger t.ex name, price och annat som hör till produkten). Jag testade med att lägga till ytterligare en LEFT JOIN men det verkar inte fungera så bra: :l

	SELECT
		*
	FROM
		products
	LEFT JOIN
		collections_desc
	ON
		collections_desc.id = products.coll 
	LEFT JOIN
		products_desc
	ON
		products_desc.id = products[s].coll[/s] .id
	WHERE
		 products.id='.$prodID.'

/r Gahh!! Det var bara ett slarvfel (se ovan). Jag bjuder på det idag.

Web-TorMedlem sedan nov. 200013 890 inlägg
#10

Ajdå. Om kolumnen "products.coll" är NULL så resulterar inte frågan något. Att den inte hämtar nåt från "collections_desc" är ju riktigt men jag vill ju fortfarande ha fram allt ur "products" och "products_desc". Hur löser man det tro?

SELECT
	*
FROM
	products
LEFT JOIN
	collections_desc
ON
	collections_desc.id = products.coll 
LEFT JOIN
	products_desc
ON
	products_desc.id = products.id
WHERE
	 products.id='.$prodID.'

/r Nu inser jag att det beror på att WHERE igentligen ser ut så här (jag hämtar rätt språk):

	WHERE
		 products.id='.$prodID.' AND collections_desc.lang = "'.$_SESSION['lang'].'" AND products_desc.lang = "'.$_SESSION['lang'].'"')

Och om "coll" är NULL så finns det ju inte något "lang" att hämta...

Hur gör jag för att bara hämta "collections_desc.lang" ifall "products.coll" <> NULL :q

Peter SMedlem sedan dec. 20025 483 inlägg
#11
SELECT
	*
FROM
	(products
INNER JOIN
	products_desc
ON
	products_desc.id = products.id)
LEFT JOIN
	collections_desc
ON
	collections_desc.id = products.coll AND
	collections_desc.lang = "'.$_SESSION['lang'].'"
WHERE
	products.id='.$prodID.' AND
	products_desc.lang = "'.$_SESSION['lang'].'"
Web-TorMedlem sedan nov. 200013 890 inlägg
#12

Det är så vackert att jag nästan får en tår i ögat. :r

257 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
126 ms — hämta forumlista (db)
130 ms — hämta statistik (db)
125 ms — hämta tråd, inlägg och bilagor (db)