Je tableau ( la recipe_categories
structure) comme ci - dessous
recipe_id sub_category_id
1 2
1 3
1 5
2 3
2 5
3 2
3 5
Je reçois sub_category_id
de l' API (il est séparé par des virgules) et je veux recipe_id
qui a tout donné sub_category_id
Exemple: 1) si l' utilisateur passe de sub_category_id
3,5 API Donc id recette 1 et 2 ont sub_category_id 3 et 5 ici recipe_id
3 sera ignoré car il n'a que sub_category_id
5 pas 3 pour résultat est recipe_id
1 et 2
2) si l' utilisateur passe sub_category_id
2,3,5 sorte que le résultat est que recipe_id
1
Avec PHP j'ai essayé de faire exploser ids et créé requête MySQL comme ci-dessous et il fonctionne:
SELECT * FROM
( SELECT *,GROUP_CONCAT(sub_category_id) as
subcat FROM `recipe_categories` group by recipe_id
ORDER BY `id` DESC )
as a where find_in_set('5',subcat)
and find_in_set('6',subcat) and find_in_set('7',subcat)
Ici, en utilisant pour la boucle, j'ai fait plusieurs FIND_IN_SET
Donc, ma question est, est-il bien meilleur que je puisse trouver le résultat attendu directement de requête MySQL sans créer une requête en utilisant PHP.
Vous pouvez mettre en œuvre cette façon générique (ne nécessitant passer la virgule séparée chaîne comme un paramètre) en comptant le nombre de correspondance sub_category_id
( en utilisant FIND_IN_SET
pour les trouver) et en le comparant avec le nombre de valeurs dans la chaîne (qui peut être déterminée en retranchant la longueur de virgules retirés de la longueur d' origine):
SELECT recipe_id
FROM recipe_categories
WHERE FIND_IN_SET(sub_category_id, '2,3,5')
GROUP BY recipe_id
HAVING COUNT(DISTINCT sub_category_id) = LENGTH('2,3,5') - LENGTH(REPLACE('2,3,5', ',', '')) + 1
Sortie (pour vos données échantillon)
recipe_id
1