我有一个包含两列的表(id,numberslist)。
如何在数字列表中获得具有“ 1 ”的所有行(在本例中为id = 2)
什么是sql语句?
id | numberslist
1 | 11,111
2 | 1,2,3
这不起作用:
$sql = "SELECT * FROM mytabelle WHERE numberslist LIKE '%1%'";
我知道以这种方式列出所有数字是一个糟糕的数据库设计,但它不可更改。
答案 0 :(得分:7)
MySQL为此目的支持regular expression语法中的“字边界”模式。
WHERE numberlist REGEXP '[[:<:]]1[[:>:]]'
您也可以使用FIND_IN_SET():
WHERE FIND_IN_SET('1', numberlist) > 0
那就是说,我同意其他答案中的评论,在这样的字符串中存储以逗号分隔的列表并不是一个好的数据库设计。请参阅我对Is storing a comma separated list in a database column really that bad?
的回答答案 1 :(得分:4)
设计非常糟糕。无论如何,对于这个糟糕的设计,这个糟糕的代码应该做的工作:D
SELECT * FROM mytabelle WHERE numberslist = '1' OR
numberslist LIKE '%,1' OR
numberslist LIKE '%,1,%' OR
numberslist LIKE '1,%';
答案 2 :(得分:3)
对于这种特殊情况,您可以执行以下操作:
WHERE numberslist = '1' OR numberslist LIKE '1,%' OR numberslist LIKE '%,1,%' OR numberslist LIKE %,1'";
假设数字和逗号之间没有空格。
但这很难看,更不用说根本就无法使用任何索引了。
答案 3 :(得分:2)
您应该阅读有关表格规范化的内容。这是一个很好的introduction。