我有如下表(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 中实现这一点。
红糖糍粑
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
- 2 回答
- 0 关注
- 135 浏览
添加回答
举报
0/150
提交
取消