查询中有多个LIKE语句

时间:2019-12-29 17:29:27

标签: mysql sql xampp mariadb

我目前正在搜索烘焙食谱的引擎,该网站根据用户的食材返回食谱。我只想以某种形式退还同时存在两种成分的食谱。我尝试了以下SQL语句,但是我似乎无法使其在AND之间正确地工作,在OR或没有AND的情况下都能正常工作。

SELECT * FROM ingredients WHERE name LIKE '%flower%' AND name LIKE '%egg%'

它确实抛出了任何错误,只是说没有任何结果,这很奇怪,因为第一个配方已经包含了机器人成分。

我希望有人能帮助我!在此先感谢

3 个答案:

答案 0 :(得分:0)

使用聚合:

SELECT recipe_id
FROM ingredients i
GROUP BY recipe_id
HAVING SUM(name LIKE '%flower%') > 0 AND
       SUM(name LIKE '%egg%') > 0;

请注意,“花”不太可能出现在配方中(尽管有一些!)。 “面粉”更为常见。

答案 1 :(得分:0)

先过滤表,然后使用条件聚合:

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

答案 2 :(得分:0)

我想您可以通过子查询和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

https://www.db-fiddle.com/f/patGWSvVjZ7Brz6eF5zqSn/0