查询中有多个 LIKE 语句
Multiple LIKE statements in query
我目前正在研究烘焙食谱的搜索引擎,网站 return 的食谱基于用户拥有的成分。我只想 return 两种成分都以某种形式存在的食谱。我尝试了以下 SQL 语句,但我似乎无法让它与介于两者之间的 AND 一起正常工作,它在有 OR 或没有 AND 的情况下都可以正常工作。
SELECT * FROM ingredients WHERE name LIKE '%flower%' AND name LIKE '%egg%'
它不会抛出任何错误,它只是说没有任何结果,这很奇怪,因为第一个食谱已经包含了机器人成分。
希望有人能帮帮我!提前致谢
使用聚合:
SELECT recipe_id
FROM ingredients i
GROUP BY recipe_id
HAVING SUM(name LIKE '%flower%') > 0 AND
SUM(name LIKE '%egg%') > 0;
请注意,"flower"s 不太可能出现在食谱中(尽管有一些!)。 "flour" 更常见。
先过滤table再使用条件聚合:
SELECT recipe_id
FROM ingredients
WHERE name LIKE '%flower%' OR name LIKE '%egg%'
GROUP BY recipe_id
HAVING COUNT(DISTINCT CASE
WHEN name LIKE '%flower%' THEN 1
WHEN name LIKE '%egg%' THEN 2
END) = 2
我认为你可以通过子查询和 HAVING COUNT 技巧解决它。
假设我们有沙拉和汤的食谱。 (原谅我的怪异作文)
id, recipe_name
--- -----------
1, 'Summer salad'
2, 'Italian soup'
和他们各自的成分
id, recipe_id, ing_name, ing_amount
--- ---------- --------- ----------
1, 1, 'egg', 200
2, 1, 'flower', 300
3, 1, 'parsley', 10
4, 1, 'salt', 5
5, 2, 'egg', 200
6, 2, 'salt', 15
如果我们的目标是显示所有枚举记录都存在的食谱,请使用此类查询:
SELECT recipes.*
FROM recipes
JOIN (
SELECT recipe_id
FROM ingredients
WHERE
ing_name LIKE '%flower%' OR
ing_name LIKE '%egg%'
GROUP BY recipe_id
HAVING COUNT(*) = 2
) AS g ON g.recipe_id = recipes.id
即通过 OR 运算符组合条件,然后计算其中有多少为真。
c1 OR c2 OR c3 GROUP BY ... HAVING COUNT(*) = 3
我目前正在研究烘焙食谱的搜索引擎,网站 return 的食谱基于用户拥有的成分。我只想 return 两种成分都以某种形式存在的食谱。我尝试了以下 SQL 语句,但我似乎无法让它与介于两者之间的 AND 一起正常工作,它在有 OR 或没有 AND 的情况下都可以正常工作。
SELECT * FROM ingredients WHERE name LIKE '%flower%' AND name LIKE '%egg%'
它不会抛出任何错误,它只是说没有任何结果,这很奇怪,因为第一个食谱已经包含了机器人成分。
希望有人能帮帮我!提前致谢
使用聚合:
SELECT recipe_id
FROM ingredients i
GROUP BY recipe_id
HAVING SUM(name LIKE '%flower%') > 0 AND
SUM(name LIKE '%egg%') > 0;
请注意,"flower"s 不太可能出现在食谱中(尽管有一些!)。 "flour" 更常见。
先过滤table再使用条件聚合:
SELECT recipe_id
FROM ingredients
WHERE name LIKE '%flower%' OR name LIKE '%egg%'
GROUP BY recipe_id
HAVING COUNT(DISTINCT CASE
WHEN name LIKE '%flower%' THEN 1
WHEN name LIKE '%egg%' THEN 2
END) = 2
我认为你可以通过子查询和 HAVING COUNT 技巧解决它。
假设我们有沙拉和汤的食谱。 (原谅我的怪异作文)
id, recipe_name
--- -----------
1, 'Summer salad'
2, 'Italian soup'
和他们各自的成分
id, recipe_id, ing_name, ing_amount
--- ---------- --------- ----------
1, 1, 'egg', 200
2, 1, 'flower', 300
3, 1, 'parsley', 10
4, 1, 'salt', 5
5, 2, 'egg', 200
6, 2, 'salt', 15
如果我们的目标是显示所有枚举记录都存在的食谱,请使用此类查询:
SELECT recipes.*
FROM recipes
JOIN (
SELECT recipe_id
FROM ingredients
WHERE
ing_name LIKE '%flower%' OR
ing_name LIKE '%egg%'
GROUP BY recipe_id
HAVING COUNT(*) = 2
) AS g ON g.recipe_id = recipes.id
即通过 OR 运算符组合条件,然后计算其中有多少为真。
c1 OR c2 OR c3 GROUP BY ... HAVING COUNT(*) = 3