webForumDet fria alternativet

LIKE gör inte riktigt det jag vill

Databaser & SQL

10 svar · 673 visningar · startad av Web-Tor

Medlem sedan nov. 200013 890 inlägg
Frågan#1

Jag har värdet "4;5;6" i (mySQL-)databasen.

Min (PHP-)kod ser ut ungefär så här:

$catID = 5;
SELECT * FROM products WHERE cat LIKE "%'.$catID.'%"

Problemet är att jag även får träff på "40;50;60".

Hur löser jag detta?

Medlem sedan jan. 2005953 inlägg
#2

Med en bättre databasstruktur. Gör en tabell med kategorier och en tabell som kopplar samman produkt och kategori.

(Det går nog att lösa med regexp också, men det är inte en lika "fin" lösning)

Medlem sedan nov. 200013 890 inlägg
#3

Jag har en tabell med kategorier och en med produkter.
En produkt kan tillhöra flera kategorier.

Hur skulle jag bygga upp databasen för att koppla ihop produkter med kategorier?

Medlem sedan jan. 2005953 inlägg
#4

Då skapar du en tabell som heter typ produkt_kategori som har två fält: produkt_id och kategori_id.

Om produkt 1 ska tillhöra kategori 1 och 5 så skapar du då två rader i tabellen produkt_kategori

produkt_id | kategori_id
1          | 1
1          | 5
Medlem sedan juni 20006 022 inlägg
#5

Gör en tredje tabell som innehåller produkt-id och kategori-id, osso en post för varje kategori som produkten tillhör.

Edit, metalboy hann före :)

Medlem sedan juni 20034 013 inlägg
#6

Du skapar en ny tabell, productcategories med två kolumner productID och catID. Om exempelvis produkten 42 finns i de tre kategorierna 40, 50 och 60 så blir det tre rader i den nya tabellen (en rad per kategori och produkt)

productID 42, catID 40
productID 42, catID 50
productID 42, catID 60

Sen JOIN:ar du i dina SELECT-satser för att få fram alla kategorier som en produkt tillhör...

Medlem sedan nov. 200013 890 inlägg
#7

Tack!

Medlem sedan nov. 200013 890 inlägg
#8

Något blir fel i min JOIN

		$SQL_items = mysql_query('
		SELECT
			id
		FROM
			products
		LEFT JOIN
			product_to_categorie
		ON
			product_to_categorie.prodID = id AND product_to_categorie.catID = '.$catID.'
		WHERE
			display = "1"')
		or die (mysql_error());

Jag får nämligen ut fler rader än vad det finns produkter?

Medlem sedan nov. 200013 890 inlägg
#9

Jag hade lagt in product_to_categorie.catID = '.$catID.' på fel ställe. Så här skall det vara:

		$SQL_items = mysql_query('
		SELECT
			id
		FROM
			products
		LEFT JOIN
			product_to_categorie
		ON
			product_to_categorie.prodID = products.id
		WHERE
			product_to_categorie.catID = '.$catID.' AND display = "1"')
		or die (mysql_error());
Medlem sedan aug. 20039 340 inlägg
#10

Du vill ha en INNER JOIN, inte en LEFT. Som det är nu plockas alla produkter ut (där display = "1") oavsett om kategorin matchar. En LEFT hade å andra sidan passat om du hade velat plocka ut alla produkter och även velat lista vilka kategorier en produkt tillhör.

Det är även värt att notera att du får ut alla kombinationer av produkter och kategorier, vilket inte gör något just nu, men om du lägger till sökning över flera kategorier så kommer du få flera produkt-rader om en produkt matchar flera kategorier. Ett sätt att lösa detta är GROUP BY products.id.

Medlem sedan nov. 200013 890 inlägg
#11

Om det är någon som kan hjälpa mig med den här frågan skulle jag vara evigt tacksam.
Så här såg koden ut där jag listan alla produkter ut en kategori när jag fortfarande hade "cat" i tabellen "products". Nu har jag ju den informationen i tabellen "product_to_categorie".

$SQL_items = mysql_query('
SELECT
	products.id,products.thumb,products_desc.name,products_desc.price
FROM
	products
LEFT JOIN
	products_desc
ON
	products_desc.id = products.id
WHERE
	products.cat = "'.$catID.'" AND products.display = "1"
ORDER BY
	products.id')
or die (mysql_error());

(Jag har alltså "products" med grundläggande info om en produkt (vikt, färg, bild) och i tabellen "products_desc" har jag information på olika språk (namn, beskrivning, pris). Mellan dessa tabeller gör jag redan en JOIN och jag fattar inte hur jag skall få till ytterligare en JOIN nu när "categorie" ligger i en egen tabell.)

266 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
137 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)