[RESOLU] Requête SQL difficile

Petit nouveau ! | 7 Messages

27 avr. 2016, 13:04

Bonjour,
J'ai une table intermédiaire entre pizza et ingrédients (4 ingredients), cette table intermédiaire contient l'id des pizzas et l'id des ingrédients correspondant. Exemple :
idPizza > idIng
[15] > [1]
[15] > [2]
[15] > [3]
[15] > [4]
(La pizza 15 contient les ingrédients 1,2,3 et 4)

Ma requête :
SELECT pizza_id , GROUP_CONCAT(ingredients_id) AS iid
FROM pizza_has_ingredients phi
GROUP BY pizza_id

Le résultat (exemple):
pizza_id = 15
iid=1,2,3,4

J'ai besoin de trouver l'id d'une pizza (15) grace à un WHERE ingredients_id=1 AND ingredients_id=2 ect....

La requête retourne un résultat vide, si je met que "WHERE ingredients_id=1", le résultat sortant est toutes les pizzas contenant l'ingrédient 1, chaque pizza a une combinaison d'ingrédients unique seulement le problème c'est bien l'agencement voir plus haut (15>1,15>2 ect...)
(Je n'arrive pas non plus avec LIKE)

Quelqu'un pourrait m'aider ? :o
Merci

Mammouth du PHP | 1967 Messages

27 avr. 2016, 15:30

Si le nombre d'ingrédient est fixe, tu peux faire 4 LEFT join vers ta table ingrédient avec un critère que l'id doit toujours être plus grands que le précédent. Tu pourra alors triéer tes résultats plus finement
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 7 Messages

27 avr. 2016, 18:02

Salut Spols,
J'ai compris l'idée, le nombre d'ingrédients n'est pas fixe, mais j'imagine pouvoir incrémenter la requête.
Je reviens vers toi dès que possible, merci encore.

Petit nouveau ! | 7 Messages

28 avr. 2016, 09:39

Cela ne convient pas. :(
Avec plusieurs left join cela multiplie l'affichage des ids ingredients.

ViPHP
ViPHP | 928 Messages

29 avr. 2016, 04:50

Salut,

Il suffit de compter pour chaque pizza le nombre d'ingrédients qui correspondent à ceux que tu cherches (tu cherches les ingrédients 1, 2, 3 et 4 dans l'exemple ci dessous), et ce nombre doit être égal au total d'ingrédients que tu cherches (donc 4 dans l'exemple).
SELECT pizza_id, COUNT(*) as total
FROM pizza_has_ingredients
WHERE ingredients_id IN (1, 2, 3, 4)
GROUP BY pizza_id
HAVING total = 4;

Petit nouveau ! | 7 Messages

29 avr. 2016, 10:23

YOUHOU :D
Merci GENOVA ! Je rajoute juste un LIMIT 1 à la fin et c'est parfait !
Génial =D>