Met mijn opleiding ben ik bezig met een webshop met daarin de volgende vraag:
Ik en mijn groepsgenoten willen bij de categorie pagina meerdere categorieën kunnen filteren en dit in de sql query kunnen plaatsen.
Behalve dan dat je niet AND moet gebruiken in je query, maar OR. Anders kan je wel op "boeken" AND "games" zoeken, maar dan krijg je waarschijnlijk niet veel terug, aangezien het meestal een boek of game is. Daarbij zou ik ook geen LIKE gebruiken, tenzij je erg onvoorstandig meerdere categorie opties in 1 databaseveld propt.
Correctie: de LIKE was voor de titel, niet voor de categorie.
Behalve dan dat je niet AND moet gebruiken in je query, maar OR. Anders kan je wel op "boeken" AND "games" zoeken, maar dan krijg je waarschijnlijk niet veel terug, aangezien het meestal een boek of game is. Daarbij zou ik ook geen LIKE gebruiken, tenzij je erg onvoorstandig meerdere categorie opties in 1 databaseveld propt.
Correctie: de LIKE was voor de titel, niet voor de categorie.
Je hebt gelijkt. De eerste moet AND zijn, maar de daaropvolgende moet OR zijn. De code is hierop aangepast.
Bedankt voor de reactie, de checkboxes werken nu. Maar het probleem is dat producten die in meerdere categorieën plaats vinden niet meer getoond worden als er twee categorieën worden aangeklikt.
Dus bijvoorbeeld een flesje water die in de kerst en in de zomer verkocht kan worden, wordt niet getoond. Dus niet alle andere producten die of alleen in de zomer of alleen in de kerst worden getoond.
Is het geen optie om voor elke checkbox die er is een query uit te voeren? Zou met behulp van een loopje vrij weinig code moeten zijn (over snelheid ga ik niet spreken)
Je hebt een database met drinken en wilt filteren op zomer en winter? Als het goed is moet dat prima werken. Heb je de laatste wijziging met AND OR gebruikt (Zie reactie Erwin)?
Laat anders wat relevante code zien.
SELECT `product`.`product_id` , `product`.`naam` , `product`.`prijs` , `product`.`omschrijving` , `product`.`voorraad`
FROM `product` , `categorie` , `categorie_product`
WHERE `product` . `product_id` = `categorie_product`. `product_id`
AND `categorie`.`categorie_id` = `categorie_product`.`categorie_id`
AND `categorie`.`naam` = 'Zomer'
AND `categorie`.`naam` = 'Winter'
Tabellen:
Product (staan producten in)
Categorie (staan de categorieën in)
categorie_product (koppeltabel voor product en categorie)
Je hebt nu zomer AND winter, dus alle resultaten die in beide categorieën voorkomen.
Wil je dus ook producten die maar in 1 van de 2 categorieën voorkomt moet je de laatste wijzigen in OR.
WHERE `product` . `product_id` = `categorie_product`. `product_id`
AND `categorie`.`categorie_id` = `categorie_product`.`categorie_id`
AND `categorie`.`naam` = 'Zomer'
OR `categorie`.`naam` = 'Winter'
[edit]Beter is denk ik nog om zomer en winter tussen haakjes te plaatsen
AND (`categorie`.`naam` = 'Zomer'
OR `categorie`.`naam` = 'Winter')
[/edit]
De vraag is hoe het opgeslagen wordt in database.
Dit lijkt mij een typisch voorbeeld van een meer op meer relatie, en dus zou er een linktabel moeten bestaan om de producten aan meerdere categorieën te kunnen koppelen.
Overigens is het een stuk eenvoudiger om WHERE ... IN te gebruiken dan elke keer ... = ... OR ... = ... te doen.
Zo te zien is er dus al normalisatie ten aanzien van de categorieen (heel goed overigens), dus dan wordt het een heel ander verhaal. Ten eerste moet je dan bepalen of een product dat aan 1 categorie voldoet moet worden gekozen, of alleen als het aan allen voldoet. Ten tweede zal je dan de rijen moeten gaan tellen.
SELECT a.product_id, a.naam, a.prijs, a.omschrijving, a.voorraad
FROM product a
LEFT JOIN categorie_product b ON a.product_id = b.product_id
LEFT JOIN categorie c ON b.categorie_id = c.categorie_id
WHERE c.naam IN ('zomer', 'winter')
GROUP BY a.product_id, a.naam, a.prijs, a.omschrijving, a.voorraad
HAVING COUNT(*) = 2;
Als je de having clause op 2 zet krijg je alleen de resultaten die aan alle categorieen voldoen, zet je het op >= 1 dan krijg je alle die 1 of meer hebben.