【问题标题】:SQL - Where like statementSQL - Where like 语句
【发布时间】:2011-12-09 00:07:52
【问题描述】:

我有一个包含两列(id、numberslist)的表格。

如何获取 numberslist 中恰好具有“1”的所有行(在本例中为 id = 2)

sql语句是什么?


标识 |数字列表

1 | 11,111
2 | 1,2,3


这不起作用:

$sql = "SELECT * FROM mytabelle WHERE numberslist LIKE '%1%'";

我知道以这种方式列出所有数字是一种糟糕的数据库设计,但它不可更改。

【问题讨论】:

  • 很抱歉你被这个架构卡住了。
  • 哇,同意@Joe 和其他人的观点。糟糕的架构。

标签: php mysql sql database


【解决方案1】:

为此,MySQL 在其regular expression 语法中支持“单词边界”模式。

WHERE numberlist REGEXP '[[:<:]]1[[:>:]]'

您也可以使用FIND_IN_SET():

WHERE FIND_IN_SET('1', numberlist) > 0

也就是说,我同意 cmets 在其他答案中的观点,即在这样的字符串中存储逗号分隔的列表不是好的数据库设计。查看我对Is storing a comma separated list in a database column really that bad?的回复

【讨论】:

  • +1 感谢您使用 Find_In_Set 函数。可悲的是,我会发现这很有用。
  • 这个答案总结了为什么比尔有 94k 分而我只有 763 分:D +1 很好的答案,我完全忘记了正则表达式和 FIND_IN_SET
  • 不错的发现,比尔。对于 OP——只要你留在 MySQL 中,这是一个很好的解决方案。 :)
【解决方案2】:

设计真的很糟糕。无论如何,对于这个糟糕的设计,这个糟糕的代码应该可以完成工作:D

SELECT * FROM mytabelle WHERE numberslist = '1' OR
                              numberslist LIKE '%,1' OR 
                              numberslist LIKE '%,1,%' OR 
                              numberslist LIKE '1,%';

【讨论】:

  • +1 用于覆盖碱基。让我们希望没有任何空格:-)
【解决方案3】:

对于这种特定情况,您可以执行以下操作:

WHERE numberslist = '1' OR numberslist LIKE '1,%' OR numberslist LIKE '%,1,%' OR numberslist LIKE %,1'";

假设数字和逗号之间没有空格。

但这很丑,更不用说根本无法使用任何类型的索引。

【讨论】:

    【解决方案4】:

    您应该阅读有关表规范化的信息。这是一个很好的introduction

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2020-12-23
      • 1970-01-01
      相关资源
      最近更新 更多