mysql:如果数字在列表字段中,则选择行(即userIDs =“1,2,3”,select * from table in userIDs中的1)

时间:2010-07-13 21:43:51

标签: mysql list

我在字段中存储id列表(按列表我的意思是val1,val2,val3,...),我想从列表中的字段中包含valX的表中选择行。

我认为这会奏效,但显然不行:(

SELECT * 
  FROM userbulletins 
 WHERE 25 IN `currentMessages` 
    OR 25 IN `removedMessages` 
    OR 25 IN `readMessages`

currentMessages,removedMessages和readMessages是将id存储为列表的字段

我也试过

SELECT * 
 FROM userbulletins 
WHERE "25" IN(`currentMessages`)

两者都不返回(并且应该在我的测试数据库中返回1行)

知道我做错了什么吗?或者如果可能的话? 谢谢!

3 个答案:

答案 0 :(得分:6)

如果我理解正确,你有一个非规范化的表,其中currentMessages值可以是“val1,val2,val3,...”,你想找到哪些行,其中25是其中一个值?如果是,请使用FIND_IN_SET function

WHERE FIND_IN_SET('25', `currentMessages`) > 0
   OR FIND_IN_SET('25', `removedMessages`) > 0
   OR FIND_IN_SET('25', `readMessages`) > 0

...但我确实建议您对数据进行规范化,以便更轻松地进行查询。

答案 1 :(得分:2)

您可以将FIND_IN_SET用于此目的:

SELECT * 
FROM userbulletins 
WHERE FIND_IN_SET("25", `currentMessages`)

如果在单个单元格中没有值列表,那么不同的设计是否更好也是值得考虑的。我建议你阅读first normal form上的这篇维基百科文章。

答案 2 :(得分:0)

那是因为IN不能那样工作。 In表示已声明的值列表或由子查询生成的列表。

要么必须将currentMessages表示为字符串,在这种情况下WHERE currentMessages LIKE '%|25|%' OR currentMessage LIKE '25|%' OR currentMessage LIKE '%|25' OR currentMessage = '25'将会混乱,或者您必须有另一个表(或其中一些表),这样它就是

SELECT * FROM userbulletins
    WHERE 25 IN (SELECT * FROM `currentMessages` WHERE....)

- 在这种情况下,我会建议消息(id,[title,content,whatever],status {current,removed,read})

fakeEDIT:使用FIND_IN_SET的解决方案比我的LIKE选项更好,但我仍然建议使用表格。