MySQL IN()函数不起作用

时间:2014-11-05 13:56:37

标签: php mysql pdo mysqli

我有一个奇怪的问题。 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');

谢谢你们的帮助!

4 个答案:

答案 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作为组件的所有条目: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)