Filter op many-to-many

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Frank Nietbelangrijk

Frank Nietbelangrijk

05/10/2015 13:01:47
Quote Anchor link
Mijn lampje wil even niet aanspringen :p

Ik heb een many-to-many met drie database tabellen:

1) recepts
-id
-name

2) ingredients
-id
-name

3) recepts-ingredients
-recept_id
-ingredient_id

Zo kan ik makkelijk alle ingrediënten laten zien die nodig zijn voor een recept.

Maar nu wil ik alleen de recepten laten zien waarin bijvoorbeeld de ingrediënten 'tomaten' en 'pesto' voorkomen. Hoe ziet deze query er dan uit?

p.s. ik wil enkel die recepten waar BEIDEN ingrediënten in zitten en niet die waar één van beide inzit.
Gewijzigd op 05/10/2015 13:04:34 door Frank Nietbelangrijk
 
PHP hulp

PHP hulp

28/03/2024 21:05:15
 
Ben van Velzen

Ben van Velzen

05/10/2015 13:11:49
Quote Anchor link
Zoiets?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT
  r.id
FROM
  recepts r
JOIN recepts_ingredients ri
  ON ri.recept_id = r.id
JOIN ingredients tomaat
  ON tomaat.name = 'tomaat' AND tomaat.id = ri.ingredient_id
JOIN ingredients pesto
  ON pesto.name = 'pesto' AND pesto.id = ri.ingredient_id
Gewijzigd op 05/10/2015 13:13:28 door Ben van Velzen
 
Thomas van den Heuvel

Thomas van den Heuvel

05/10/2015 13:44:50
Quote Anchor link
Dit klinkt als de doorsnede van twee verzamelingen? Wellicht biedt INTERSECT uitkomst?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

05/10/2015 13:49:31
Quote Anchor link
Dank je wel voor je reactie Ben maar het wil nog niet lukken. als ik de query wijzig in
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT
  r.id, r.name, a.name
FROM
  recepts r
JOIN recepts_ingredients ri
  ON ri.recept_id = r.id
JOIN ingredients a
  ON a.name = 'tomaat' AND a.id = ri.ingredient_id
JOIN ingredients b
  ON b.name = 'pesto' AND b.id = ri.ingredient_id


Dan krijg ik een lege resultaatset.

Als ik de laatste JOIN weglaat dan krijg ik alle recepten met het ingredient tomaat.
 
Ben van Velzen

Ben van Velzen

05/10/2015 13:56:20
Quote Anchor link
Niet getest:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
  r.id, r.name, a.name
FROM
  recepts r
JOIN recepts_ingredients ri1
  ON ri1.recept_id = r.id
JOIN recepts_ingredients ri2
  ON ri2.recept_id = r.id
JOIN ingredients a
  ON a.name = 'tomaat' AND a.id = ri1.ingredient_id
JOIN ingredients b
  ON b.name = 'pesto' AND b.id = ri2.ingredient_id
 
Frank Nietbelangrijk

Frank Nietbelangrijk

05/10/2015 14:10:18
Quote Anchor link
Thomas, dank je wel. Volgens mij ondersteunt MySQL geen INTERSECT? En Ben het geeft nog niet het gewenste resultaat.
 
Ben van Velzen

Ben van Velzen

05/10/2015 14:21:24
Quote Anchor link
Vreemd, de tweede query lijkt bij mij het gewenste resultaat te geven.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/10/2015 14:46:17
Quote Anchor link
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
SELECT
    r.id,
    r.name
FROM
    recepts r
JOIN
    recepts_ingredients ri
    ON r.id = ri.recept_id
JOIN
    ingredients i
    ON ri.ingredient_id = i.id
WHERE i.name IN ('tomaat', 'pesto')
GROUP BY r.id
HAVING COUNT(*) = 2

PS Het is recipe in het Engels ;-)
Gewijzigd op 05/10/2015 14:48:48 door Ger van Steenderen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

05/10/2015 14:55:42
Quote Anchor link
Inmiddels dit antwoord gekregen via een engelstalig forum:

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
    r.id, r.name, GROUP_CONCAT(DISTINCT(i.name)) as items
FROM
    recepts r
LEFT JOIN
    recepts_ingredients ri
ON
    ri.recept_id = r.id
LEFT JOIN
    ingredients i
ON
    ri.ingredient_id = i.id
GROUP BY
    r.id
HAVING
    FIND_IN_SET('tomaat',items) AND FIND_IN_SET('pesto',items)


Mocht er nog een beter of simpeler antwoord zijn dan hou ik me aanbevolen.

Toevoeging op 05/10/2015 14:59:40:

@Ger: Die van jou is korter en doet wat ie moet doen :-) Merci!

>> PS Het is recipe in het Engels ;-)

Ja daar kwam ik ook achter.
 



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.