MySQL obtenir intersection de plusieurs RAWs

Yasin Patel

Je tableau ( la recipe_categoriesstructure) 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_idde l' API (il est séparé par des virgules) et je veux recipe_idqui a tout donné sub_category_id

Exemple: 1) si l' utilisateur passe de sub_category_id3,5 API Donc id recette 1 et 2 ont sub_category_id 3 et 5 ici recipe_id3 sera ignoré car il n'a que sub_category_id5 pas 3 pour résultat est recipe_id1 et 2

2) si l' utilisateur passe sub_category_id2,3,5 sorte que le résultat est que recipe_id1

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.

Pseudo :

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_SETpour 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

Démo dbfiddle

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=298593&siteId=1
conseillé
Classement