查询中有多个 LIKE 语句

Posted

技术标签:

【中文标题】查询中有多个 LIKE 语句【英文标题】:Multiple LIKE statements in query 【发布时间】:2020-04-18 15:51:13 【问题描述】:

我目前正在开发烘焙食谱的搜索引擎,该网站根据用户拥有的成分返回食谱。我只想以某种形式返回两种成分都存在的食谱。我尝试了以下 SQL 语句,但我似乎无法让它与介于两者之间的 AND 正常工作,无论使用 OR 或不使用 AND,它都可以正常工作。

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

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

希望有人能帮帮我!提前致谢

【问题讨论】:

您确定这两种成分都出现在名称中吗? 规范化你的架构 见Why should I provide an MCRE for what seems to me to be a very simple SQL query 您似乎不了解逻辑运算符的工作原理。在日常用语中可能听起来像 SQL 中的“选择 A 和 B”这一事实将被表示为“SELECT * WHERE x = 'A' OR x = 'B'”。在 SQL 中,逻辑运算符仅在单个条目中起作用。这不是条目的联合。 举几个应该匹配的行的例子。 【参考方案1】:

使用聚合:

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

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

【讨论】:

这个工作和我评论的另一个一样好。解决了我的问题!再次感谢。【参考方案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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

这个效果很好,解决了我的问题!再次感谢。

以上是关于查询中有多个 LIKE 语句的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询语句中like 的用法

sql语句中like的用法详细解析

mysql like查询语句

使用多个 LIKE 语句和 REGEXP 的查询可以更有效吗?

使用 PDO 准备语句从搜索字段中使用多个关键字进行 LIKE 查询

sql语句中like的用法