MySQL - WHERE IN 将列表放入字段
Posted
技术标签:
【中文标题】MySQL - WHERE IN 将列表放入字段【英文标题】:MySQL - WHERE IN with a list into a field 【发布时间】:2012-12-06 22:07:03 【问题描述】:我有一个包含此值的字段(“角色”)
roles
row_1: 1,2,3,5
row_2: 2,13
我这样做:
SELECT * FROM bloques WHERE 2 IN (roles)
只找到 row_2,因为它从 2 开始
LIKE 选项不起作用,因为如果我找到 1
SELECT * FROM bloques WHERE roles LIKE '%1%'
,它给了我两行。
【问题讨论】:
您的要求是什么?我无法理解..您期望什么价值?为什么? 不要介意下面的所有答案,唯一有效的答案是:阅读数据库规范化并丢弃您的数据库设计! 重复***.com/questions/13928538/… 【参考方案1】:FIND_IN_SET 函数可以帮你:
SELECT FIND_IN_SET('b','a,b,c,d');
对于您的代码:
SELECT * FROM bloques WHERE FIND_IN_SET(2,roles);
另外,我建议您将架构移动到 1NF
【讨论】:
【参考方案2】:你能用正则表达式吗? http://dev.mysql.com/doc/refman/5.1/en/regexp.html
否则,您可以在行的开头和结尾添加逗号。
select * from mytable where ',' + roles + ',' like '%,2,%'
【讨论】:
【参考方案3】:SELECT
*
FROM
bloques
WHERE
roles LIKE '%,2,%'
OR roles LIKE '2,%'
OR roles LIKE '%,2'
第一种情况会给出所有 2 位于集合中间的情况,第二种情况是 2 开始集合,第三种情况是 2 结束集合。这可能效率极低,但应该可以。
【讨论】:
... 你只需要第四个案例来表示“2”。有更好的方法。【参考方案4】:你可以在这里使用这个正则表达式:
SELECT * FROM bloques
WHERE roles REGEXP '[[:<:]]2[[:>:]]';
...或者,在更一般的情况下:
SELECT * FROM bloques
WHERE roles REGEXP CONCAT('[[:<:]]', :your_value, '[[:>:]]');
您需要使用这些看起来很奇怪的东西,因为它们匹配单词边界 - 防止匹配 '2' 出现在 '23' 和 '32'。 )
问题是查询只是使用非规范化字段带来的麻烦的开始。我建议使用 SET 类型(如果选项数量有限且很少),或者更好的是,使用联结表来存储 m-n 关系。
【讨论】:
【参考方案5】:使用FIND_IN_SET()函数
试试这个:
SELECT * FROM bloques WHERE FIND_IN_SET(1, roles);
或
SELECT * FROM bloques
WHERE CONCAT(',', roles, ',') LIKE '%,1,%';
【讨论】:
以上是关于MySQL - WHERE IN 将列表放入字段的主要内容,如果未能解决你的问题,请参考以下文章