sql - 如何在 SQL 中的 WHERE 中和上链接多重?
问题描述
我想做类似的事情:
SELECT "recipes"."id"
FROM "recipes"
INNER JOIN "groups" ON "groups"."recipe_id" = "recipes"."id"
INNER JOIN "steps" ON "steps"."group_id" = "groups"."id"
INNER JOIN "steps_ingredients_memberships" ON "steps_ingredients_memberships"."step_id" = "steps"."id"
INNER JOIN "ingredients" ON "ingredients"."id" = "steps_ingredients_memberships"."ingredient_id"
WHERE (ingredients.id IN (5, 6) AND ingredients.id IN (10, 11))
LIMIT 10
但是这个请求返回 0 行......
我知道这个请求不能工作,但我找不到解决方案
我想得到含有成分 5 OR
6 AND
10 OR
11 的“食谱”。想想:
5 = tomatoes
6 = big tomatoes
10 = potatoes
11 = big potatoes
OR
我想要西红柿大西红柿AND
土豆大土豆的“食谱” OR
。
采用的解决方案
因为成分可以是随机的,所以我写了一个范围:
scope :ingredients_filtering, lambda { |ingredients|
return if ingredients.nil?
queries = []
ingredients.each do |ingredient|
related_ids = ingredient.related_ids.uniq.join(', ')
queries << "BOOL_OR(ingredients.id IN (#{related_ids}))"
end
group(:id).having(queries.join(' AND '))
}
谢谢大家!:)
解决方案
你想要聚合。按食谱分组,看看它是否有所需的成分。
SELECT r.id
FROM recipes r
JOIN groups g ON g.recipe_id = r.id
JOIN steps s ON s.group_id = g.id
JOIN steps_ingredients_memberships sim ON sim.step_id = s.id
JOIN ingredients i ON i.id = sim.ingredient_id
GROUP BY r.id
HAVING BOOL_OR(i.id IN (5, 6)) AND BOOL_OR(i.id IN (10, 11));
推荐阅读
- linux - Linux终端没有响应任何键盘信号
- c# - C#按下任何按钮时如何重复一段代码?
- flutter - 创建媒体播放器时线性进度指示器和手势检测器的问题
- javascript - javascript dom 等效于 jquery appendTo
- kotlin - 如何在 gradle 任务被杀死后运行命令?
- html - 字体真棒(快捷方式)?
- javascript - 通过向 Cognito 发送验证码,直接从您的应用程序获取 cognito 电子邮件验证
- python - 如何在 CSV 文件的特定单元格中写入内容?
- github-actions - github 操作在工作流之间共享值
- pandas - 如何在 Pandas 中更新文件