我有一个奇怪的问题。 MySQL数据库上的IN()函数停止工作。
我的表格结构如下:
| id | name | categories |
---------------------------
| 1 | User1 | 1, 12, 55 |
---------------------------
| 2 | User2 | 12, 55, 76 |
---------------------------
| 3 | User3 | 1, 55, 76 |
要按特定类别列出用户,我大致会这样:
SELECT * FROM `users` WHERE `categories` IN ('1','12','55')
或仅来自一个类别:
SELECT * FROM `users` WHERE `categories` IN ('76')
问题是如果我只问一个参数,我就没有结果。如果询问更多参数,则仅按列表中的第一个ID列出用户,而另一个不列出。
在我没有这种问题之前。我不明白我在哪里犯错误。谢谢!
感谢@Andreas Hauser,我最终得到了正确的结果。
这是解决方案:
SELECT * FROM users WHERE FIND_IN_SET ('76',REPLACE(categories,' ',''));
这完全符合预期。
其他解决方案非常智能且有用,我将在未来使用它们,特别是来自@Justinas的解决方案以及来自@Bilal Rao的提议,用于搜索类别:
SELECT `u`.* FROM `user` `u` JOIN `category` `c` ON `c`.`user_id` = `u`.`id` WHERE `c`.`id` IN ('1', '5', '58');
谢谢你们的帮助!
答案 0 :(得分:3)
在这种情况下你必须使用FIND_IN_SET。
SELECT * FROM `users` WHERE FIND_IN_SET ('76',categories);
这将列出所有类别为76的用户。
答案 1 :(得分:1)
仅适用于数字字段ID或精确字符串,其中值超出您搜索的值。
您有一个以逗号分隔的列表。从该表中获取数据并不是很好。如果您有字符串,则必须使用LIKE
问题就是当你搜索%7%
时,你也会搜索7,77,777。
您可以使用FIND_IN_SET
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set
答案 2 :(得分:1)
您的类别列中有逗号分隔值,而 IN 仅适用于完全匹配。请创建另一个表并将这些逗号分隔值作为一对多关系放置。这样您就可以使用Inner Join a IN运算符来访问它们。
答案 3 :(得分:1)
您categories
列的类型为VARCHAR
,单个单元格的类似"1, 12, 55"
。
IN
运算符用于每个单元格的单个条目。也就是说,如果您使用id IN (1, 5, 6)
,它将获得ID为1,5和/或6的元素
现在要搜索字符串,请使用LIKE
运算符
SELECT * FROM `user` WHERE `categories` LIKE "%58%"
但它会选择58
作为组件的所有条目:1258
,5864
,1586
等等。
最好使用数据透视表。
user_id | category_id
----------------------
1 | 5
1 | 6
2 | 58
而不是使用查询:
SELECT u.* FROM user u JOIN category c ON c.user_id = u.id WHERE c.id IN (1, 5, 58)