我在字段中存储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行)
知道我做错了什么吗?或者如果可能的话? 谢谢!
答案 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选项更好,但我仍然建议使用表格。