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)
10 svar · 673 visningar · startad av Web-Tor
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?
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)
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?
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
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 :)
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...
Tack!
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?
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());
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.
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.)