Py学习  »  DATABASE

MySQL获取多个raw的交集

Yasin Patel • 5 年前 • 1608 次点击  

recipe_categories )结构如下

recipe_id   sub_category_id
1           2
1           3
1           5
2           3
2           5
3           2
3           5

我得到了 sub_category_id 从API(以逗号分隔)开始 recipe_id 它都给出了子类别

例子: 子类别id 所以配方id 1和2有子类别id 3和5 在这里 配方id 3将被忽略,因为它只有 5而不是3 所以结果是 1和2

2) 如果用户通过 子类别id 所以结果只是 配方id 1个

使用PHP,我尝试分解id并创建MySQL查询,如下所示,它正在工作:

 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)

在这里,使用for循环,我在集合中找到了多个

所以我的问题是,有没有更好的方法可以直接从MySQL查询中找到预期的结果,而无需使用PHP创建查询。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56110
 
1608 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Tim Biegeleisen
Reply   •   1 楼
Tim Biegeleisen    5 年前

以下是处理您的需求的规范方法:

SELECT recipe_id
FROM recipe_categories
WHERE sub_category_id IN (3, 5)
GROUP BY recipe_id
HAVING COUNT(DISTINCT sub_category_id) = 2;

您可能需要做一些额外的工作来使用准备好的语句从PHP实现这一点。

Nick Nina Scholz
Reply   •   2 楼
Nick Nina Scholz    5 年前

通过计算匹配的数量,您可以用一种通用的方式(只需要将逗号分隔的字符串作为参数传递)实现此功能 sub_category_id (使用 FIND_IN_SET 要找到它们)并将其与字符串中的值的数目(可以通过从原始长度中减去逗号的长度来确定)进行比较:

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

输出(用于示例数据)

recipe_id
1

Demo on dbfiddle