使用MySql正则表达式匹配两个逗号分隔的字符串

6

我有一个包含以下数值的表格:

id    |    value      |
-----------------------
1     | 1,2,5,8,12,20 |    
2     | 11,25,26,28   |    
-----------------------

现在我想从上面的值列中搜索一些逗号分隔的ID,例如:'1,3,6,7,11'

SELECT id FROM tbl_name  
WHERE value REGEXP '*some reg exp goes here containing 1,3,6,7,11*'
LIMIT 1,0;

SELECT id FROM tbl_name  
WHERE value REGEXP '*some reg exp goes here containing 3,6,27,15*'
LIMIT 1,0;

以上第一条查询应返回1,而第二条应返回NULL。

我对正则表达式还不熟悉,有人能帮忙吗?谢谢。


只是为了确保我理解,它应该返回1,因为至少有一个数字与具有该ID的行匹配吗? - Joachim Isaksson
仅作为附注,不要期望使用这种数据格式的查询性能良好,它将无法使用任何形式的索引,并且一直需要读取整个表才能回答查询。换句话说,如果存在超过几百行数据,则无法实时渲染网页。 - Joachim Isaksson
不,那应该是该行的ID,而且如果至少有一个数字匹配,则返回。 - prashant
你应该了解一对多关系。http://en.tekstenuitleg.net/articles/software/database-design-tutorial/one-to-many.html - Powertieke
数字是否按照数值顺序存储,并且搜索词中的数字也是按照数值顺序排列的吗? - Bohemian
是的,这些数字是按升序排序的。 - prashant
1个回答

17
REGEXP '(^|,)(1|3|6|7|11)(,|$)'

将匹配包含数字序列1,3,6,7,11中任意一个数字的所有值。

您不应该使用一列来保存多个值。规范化数据!

答案已编辑


谢谢@Michel,但我想匹配提供的字符串中的任何数字(至少一个)是否与值匹配,就像我的问题1在第一个字符串和值中匹配一样。 - prashant
更新的答案。这些值代表什么?随着值长度和表大小的增长,此查询将需要更多时间。如果您愿意,我可以帮助您解决规范化问题。 - Michel Feldheim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接