MySQL获取多个原始数据的交集

我有如下表(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哪个都给出了 sub_category_id


示例:1)如果用户sub_category_id在 API 中传递 3,5 所以配方 id 1 和 2 有 sub_category_id 3 和 5 这里recipe_id3 将被忽略,因为它只有sub_category_id5 而不是 3 所以结果是recipe_id1 和 2


2)如果用户通过sub_category_id2,3,5 所以结果只有recipe_id1


使用 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 循环我做了多个 find_in_set


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


繁华开满天机
浏览 136回答 2
2回答

紫衣仙女

这是处理您的要求的规范方法:SELECT recipe_idFROM recipe_categoriesWHERE sub_category_id IN (3, 5)GROUP BY recipe_idHAVING COUNT(DISTINCT sub_category_id) = 2;您可能需要做一些额外的工作才能使用准备好的语句从 PHP 中实现这一点。

红糖糍粑

您可以通过计算匹配数sub_category_id(FIND_IN_SET用于查找它们)并将其与字符串中的值数(可以通过减去从原始长度中删除逗号的长度):SELECT recipe_idFROM recipe_categoriesWHERE FIND_IN_SET(sub_category_id, '2,3,5')GROUP BY recipe_idHAVING COUNT(DISTINCT sub_category_id) = LENGTH('2,3,5') - LENGTH(REPLACE('2,3,5', ',', '')) + 1输出(用于您的样本数据)recipe_id1dbfiddle 上的演示
打开App,查看更多内容
随时随地看视频慕课网APP