Beste phpers,

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.
Je hebt tags die elkaar aanvullen:

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...
Op basis van je opgegeven gegevens krijg ik een rode jas en een rode broek met deze query :
SELECT
	tag_product.*,
	tags.*,
	products.*
FROM
	tag_product
JOIN
	tags
ON
	tag_product.tag_id = tags.id
JOIN
	products
ON
	tag_product.product_id = products.id
WHERE
	tags.id = 1;
Yep, dat klopt, maar er zou in de tabel producs een name kunnen zijn met "jas rood blauw geel".
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.

Reageren