【问题标题】:MySQL LIKE statement for comma separated numbers逗号分隔数字的 MySQL LIKE 语句
【发布时间】:2020-04-10 14:34:44
【问题描述】:

这不是重复的,因为我已经尝试了在这里找到的所有解决方案。我什至不知道如何在标题中包含我的问题。

我在列中有数值:

+-----------+
| tags      |
+-----------+
| 1,14      |
| 2,3       |
| 2,4       |
| 1,14      |
| 2,3,4     |
| 1         |
| 9         |
| 1,2,15,16 |
| 1,3,17    |
| 1,18      |
| 2,3,4     |
| 20,21     |
+-----------+

例如,我想选择标签 = 1 的帖子。

如果我这样做

"SELECT * FROM articles WHERE tags LIKE '%1%'";

MySQL 将返回所有标记为:14、15、16、21...任何其他数字的帖子,其中包含“1”;

我一直在尝试很多没有给我任何东西的陈述,例如:

$result = $this->db->query("SELECT * FROM articles WHERE CONCAT(',', tags, ',') LIKE ? ORDER BY date_pub DESC LIMIT 4", "%,$tag_id,%")->fetchAll();

等;

不幸的是,每次我都面临同样的结果。 MySQL 返回所有包含“1”的数字。

换句话说,1、13、127494849040450、3900000000000001,MySQL 看到“1”的任何地方都会返回文章。

但我的目标是从逗号分隔的 VARCHAR 字符串中获取唯一的 number 并返回具有此类 numeric 标签的文章。

如果有人可以帮助我解决这个问题,我将不胜感激。

【问题讨论】:

  • 但是,我还是想找到一个解决方案。
  • 虽然@David 是正确的,但中间步骤是使用delimiter 值始终出现在数字之前和之后,无论如何,所以1 变为,1, 和@987654327 @ 变为 ,2,3,4, 然后您可以在 LIKE 子句中简单地使用该分隔符
  • 我不明白这个问题 - 如果任何标签 = 1,您是否想要标签中的所有值?然后呢?

标签: mysql


【解决方案1】:

对于这个问题有函数FIND_IN_SET():

SELECT * 
FROM articles 
WHERE FIND_IN_SET('1', tags)

如果你想使用LIKE:

SELECT *
FROM articles
WHERE CONCAT(',', tags, ',') LIKE '%,1,%'

或者更好地使用CONCAT()作为参数'1'

SELECT *
FROM articles
WHERE CONCAT(',', tags, ',') LIKE CONCAT('%,', '1', ',%')

【讨论】:

    【解决方案2】:

    纠正问题(而不是只解决症状并延长根本原因)的方法是规范化数据,这样您就不会使用逗号分隔的值。这将简化数据、提高查询性能并防止出现与您遇到的问题完全相同的问题。


    话虽如此,您也许可以通过以下方式维持您的解决方法:

    WHERE `tags` = '1' OR `tags` LIKE '1,%' OR `tags` LIKE '%,1,%' OR `tags` LIKE '%,1'
    

    这假设您不能保证标签总是按排序顺序排列。毕竟,它们只是一个字符串,而不是可排序的数值列表。如果您可以安全地假设它们总是井井有条,那么这也应该可以解决问题:

    WHERE `tags` = '1' OR `tags` LIKE `1,%`
    

    【讨论】:

      【解决方案3】:

      WHERE tags = '1' OR tags like '1 ,%'

      • 假设标签按数字顺序排列,并且 1 在出现时排在第一位。否则将需要进一步的条款。

      【讨论】:

        【解决方案4】:

        这里可以使用像 aka RLIKE 这样的正则表达式

        SELECT * FROM articles WHERE tags RLIKE '(^|,)nn(,|$)'; -- where nn the need number 
        

        正则表达式匹配字符串或逗号开头(^|,),然后编号我们需要的后跟逗号或字符串结尾(,|$)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-22
          • 2013-06-04
          • 2018-05-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多