Lastige query in een keer, of toch in loop

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dirk Vries

Dirk Vries

07/07/2020 10:38:16
Quote Anchor link
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.
 
PHP hulp

PHP hulp

15/08/2020 09:33:07
 
Adoptive Solution

Adoptive Solution

07/07/2020 11:17:48
 
Dirk Vries

Dirk Vries

07/07/2020 11:20:42
Quote Anchor link
Adoptive Solution op 07/07/2020 11:17:48:


Volgens mij is dat voor 1 tag/product, maar niet voor de hele lijst... Ik kom er in ieder geval niet meer uit
 
Ward van der Put
Moderator

Ward van der Put

07/07/2020 12:54:14
Quote Anchor link
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.
 
Dirk Vries

Dirk Vries

07/07/2020 12:58:54
Quote Anchor link
In principe moet er een "jas rood blauw" mogelijk zijn...
 
Adoptive Solution

Adoptive Solution

07/07/2020 13:05:18
Quote Anchor link
Op basis van je opgegeven gegevens krijg ik een rode jas en een rode broek met deze query :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
 
Dirk Vries

Dirk Vries

07/07/2020 13:15:33
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.