为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
繁华开满天机 2022-10-28 15:49:32
我有如下表(recipe_categories)结构recipe_id   sub_category_id1           21           31           52           32           53           23           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 和 22)如果用户通过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 创建查询。
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

这是处理您的要求的规范方法:


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 中实现这一点。


查看完整回答
反对 回复 2022-10-28
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

您可以通过计算匹配数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

dbfiddle 上的演示


查看完整回答
反对 回复 2022-10-28
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信