【问题标题】:SQL Like Operator not working as expected in PHPSQL Like 运算符在 PHP 中无法按预期工作
【发布时间】:2021-08-07 07:21:28
【问题描述】:

我正在尝试从具有特定内容tags 值的数据库中获取所有数据。如果我运行下面的代码,它只返回带有id 1 的行,即使单词tag 是两行中tags 值的一部分。我还添加了%or% 运算符,但它正在获取确切的行。当我搜索 tag 时,它显示 2 行,但使用下面 $mytags 中的值,它只匹配 1 行。

如果$mytags 中的任何内容匹配,我希望表达式获得一行。

SQL

$mytags = "tag, tag1";
SELECT * FROM table WHERE tags LIKE '%$mytags%' ORDER BY id DESC
id body tags
1 Loreum Content 1 tag, tag1
2 Loreum Content 2 tag

【问题讨论】:

  • 您应该发布您的实际代码,而不是伪代码。
  • 您是想要基于tag 匹配的两行还是基于tag, tag1 匹配的一行?
  • 如果tags 列和$mytags 变量都可能包含CSV 标签列表,则LIKE 运算符不适用。将其中一个解析为单独的值并分别测试每个值或使用另一种技术(例如,在 MySQL 中,使用字符串函数将这些值转换为 JSON,然后使用 JSON_OVERLAPS() 函数)。
  • 修复你的数据模型!如果您在字符串列中存储多个值,则会损坏。
  • 您尝试过什么来解决您的问题?你被困在哪里了?

标签: php mysql sql sql-like


【解决方案1】:

您对LIKE 工作方式的期望似乎是错误的。如果您希望选择与 $mytags 变量中的任何逗号分隔标记匹配的行,则需要以不同的方式执行此操作。

如果你想使用LIKE,你需要扩展并使用OR

SELECT * FROM table WHERE tags LIKE '%tag%' OR tags LIKE '%tag1%' ORDER BY id DESC

但是对于可变数量的标签,实现此目的的更好方法是使用REGEXP

SELECT * FROM table WHERE tags REGEXP 'tag|tag1' ORDER BY id DESC

您需要做的就是将$mytags 中的分隔符更改为|(无空格):

$mytags = 'tag|tag1' 

【讨论】:

  • 你的REGEXP 用变量完美工作,我将逗号替换为| 并且它有效。谢谢
猜你喜欢
  • 2021-11-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 2011-06-14
  • 2012-12-22
  • 2020-01-09
  • 2020-01-13
  • 2015-05-11
相关资源
最近更新 更多