MySQL IN()函数不起作用


MySQL IN() function not work

我有一个奇怪的问题。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作为组件的条目:125858641586等等

最好使用数据透视表。

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)