我有一个食谱应用程序,其中有两个主表,结构如下;
食谱
- ID
- 标题
食谱成分
- ID
- recipe_id
- 姓名
- 完整描述
其中recipe_ingredients包含链接到配方的多行并保存有关每种成分的信息。
我正在尝试对数据库进行搜索以返回包含“鸡肉”和“大米”作为成分的所有食谱,但我当前的查询未返回任何结果,因为我相信它正在搜索包含鸡肉和大米的成分是单一成分(行)。
这是我的查询;
SELECT r.* FROM recipe AS r
INNER JOIN recipe_ingredient AS ri ON ri.recipe_id = r.id
WHERE (ri.name LIKE '%chicken%' OR ri.full_description LIKE '%chicken%') AND (ri.name LIKE '%rice%' OR ri.full_description LIKE '%rice%')
GROUP BY r.id
上面的查询根本没有返回任何结果,但数据库中有包含鸡肉和米饭作为成分的食谱。
最佳答案
一旦食谱中的成分既不是大米也不是鸡肉,这个方法就会失败;您必须使用内部查询来查看每个食谱是否存在给定的成分。
像这样:
SELECT r.* FROM recipe AS r
WHERE EXISTS (
SELECT *
FROM recipe_ingredient ri
WHERE ri.recipe_id = r.id
AND (ri.name LIKE '%chicken%' OR ri.full_description LIKE '%chicken%')
)
AND EXISTS (
SELECT *
FROM recipe_ingredient ri
WHERE ri.recipe_id = r.id
AND (ri.name LIKE '%rice%' OR ri.full_description LIKE '%rice%')
)
这并不是很优雅,但你明白我的意思。
关于MySQL 如何返回在另一个表中找到值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42624298/