我有一个奇怪的问题。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');
谢谢你们的帮助!
在这种情况下,您必须使用FIND_IN_SET。
SELECT * FROM `users` WHERE FIND_IN_SET ('76',categories);
这将列出设置了类别76的所有用户。
这只适用于数字字段ID或精确字符串,其中值是您搜索的值。
您有一个逗号分隔的列表。从那个表中提取数据并不是很好。当你有一个字符串时,你必须用LIKE
进行搜索
like的问题是,例如,当您搜索%7%
时,您也会搜索77777。
您可以使用FIND_IN_SET
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-设置
您的类别列中有逗号分隔的值,in仅适用于完全匹配。请创建另一个表,并将这些逗号分隔的值放置为一对多关系。以便您可以通过使用Inner Join an IN运算符来访问它们。
您的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)