【问题标题】:Using OR in LIKE Query in MySQL to compare multiple fields在 MySQL 的 LIKE Query 中使用 OR 比较多个字段
【发布时间】:2012-06-19 18:15:04
【问题描述】:

我一直认为您可以在LIKE 语句中使用OR 来查询MySQL 中的内容。因此,如果我想将一行中的多个字段与 1 个关键字或术语进行比较:

SELECT * FROM MyTable WHERE Column1 OR Column2 LIKE '%keyword%'; 

如果我有一组单词要比较:

SELECT * FROM MyTable WHERE Column1 OR Column2 LIKE '%keyword1%' 
AND Column1 OR Column2 LIKE '%keyword2%';

但是,我不相信语法是正确的。除了类似以下内容之外,是否还有一种有效的方法来编写此内容:

SELECT * FROM MyTable WHERE Column1 LIKE '%keyword1%' OR Column2 LIKE 
'%keyword1%' AND Column1 LIKE '%keyword2%' OR Column2 LIKE '%keyword2%';

我这样做对吗?

【问题讨论】:

  • 我只是想知道你的“单词数组”算法......如果一列像一个单词并且如果一列像另一个,你确定要检索结果吗?对我来说似乎效率很低
  • 关键字来自搜索字段,因此用户将希望根据多个字段搜索数据库。如果他们在搜索词中使用 2 个词,则在两列中搜索该词仍然有意义。我不想排除一个字段,因为它们可能包含多个相关词。

标签: mysql sql-like


【解决方案1】:

最接近您想要的语法是:

SELECT * FROM MyTable
WHERE (CONCAT(Column1, Column2) LIKE '%keyword1%')
AND (CONCAT(Column1, Column2) LIKE '%keyword2%')

注意:搜索字符串开头的“%”不包括索引的使用。如果有大量记录要搜索,最好重新考虑实现。

如果不能保证每一列都不为 NULL,那么请改用 CONCAT_WS:

SELECT * FROM MyTable
WHERE (CONCAT_WS("-", Column1, Column2) LIKE '%keyword1%')
AND (CONCAT_WS("-", Column1, Column2) LIKE '%keyword2%')

此 CONCAT_WS 解决方案还有一个可能的好处,即如果您选择的分隔符从未出现在您的关键字中,则该解决方案还可以确保仅在 Column1 或 Column2 中匹配您的“关键字”。

【讨论】:

  • 如果将两个字符列相加,它们将被转换为数字并相加。结果很可能为零,并且您的 WHERE 子句永远不会计算为真。要连接 MySQL 中的列,请使用 CONCAT。
  • 我推荐 CONCAT_WS 除非您可以确定 Column1 和 Column2 永远不会为空。否则他们将返回 false。它可能仍与其中一列匹配。
  • 如果 column1 的值为“xxxkey”,column2 的值为“word1xx”,您的查询会将其视为 true,即 WRONG。
【解决方案2】:

使用这个::

SELECT * FROM MyTable WHERE (Column1 LIKE '%keyword1%' OR Column2 LIKE 
'%keyword1%') AND (Column1 LIKE '%keyword2%' OR Column2 LIKE '%keyword2%');

【讨论】:

  • 啊。我认为括号是必要的吗?这可以解释为什么它以前不起作用....
猜你喜欢
  • 1970-01-01
  • 2018-05-22
  • 2012-06-03
  • 2013-02-17
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2019-10-12
相关资源
最近更新 更多