Lastige query in een keer, of toch in loop
ik heb de volgende database tabels:
products:
id| name
1 | jas rood
2 | broek rood
3 | broek blauw
tags:
id | name
1 | rood
2 | blauw
3 | broek
4 | jas
tag_product:
id | tag_id | product_id
1 | 1 | 1
2 | 1 | 2
3 | 2 | 3
4 | 3 | 2
5 | 3 | 3
6 | 4 | 1
Hiermee bouw ik een menu op die er in de index zo uit ziet:
rood (2)
blauw (1)
broek (2)
jas (1)
als de gebruiker op rood klikt, mogen alleen alle mogelijke combinaties met rood verschijnen en moet het menu er zo uit zien:
rood(2)
broek(1)
jas (1)
Oftewel de query moet de volgende stappen doorlopen:
1. selecteer de selected tag_id uit de tags table (=>id 1)
2. selecteer de product_id's uit de tag_product table de rijen waar tag_id=1 (=>product_id's 1,2)
3. selecteer de tag_ids uit de tag_product table waar de product_id = 1,2 (=> tag_id = 1,1,3,4)
4. group by en count deze tag_id's
Ik kom er niet uit om dit in 1 query te doen, of is dit onbegonnen werk....
Kan iemand me op weg helpen? Mijn dank is groot.
Adoptive Solution op 07/07/2020 11:17:48:
Het antwoord staat in je vorige topic.
https://www.phphulp.nl/php/forum/topic/mysql-query-in-cache/103599/#750103
https://www.phphulp.nl/php/forum/topic/mysql-query-in-cache/103599/#750103
Volgens mij is dat voor 1 tag/product, maar niet voor de hele lijst... Ik kom er in ieder geval niet meer uit
rood + jas
blauw + broek
Daarnaast heb je tags die elkaar uitsluiten:
rood != blauw
jas != broek
Dat verschil drukt je datamodel (nog) niet uit, waardoor je queries in bochten moet wringen wanneer dat verschil relevant is. De gebruikelijke oplossing hiervoor is attributen (tags) combineren tot attribuutgroepen.
In principe moet er een "jas rood blauw" mogelijk zijn...
Deze query lukt mij zelf ook. Het gaat puur om de query voor het menu.
Stel dat de tag rood is opgegeven, kijken welke tags er nog meer voorkomen in de products en tel de mogelijke products.
Nu kan ik een query draaien om alle tag id's van een product weer op te halen en dit in een string te plaatsen om vervolgens weer een query te draaien om te kijken welke tags er in die string zitten.