MySQL WHERE IN()


83

我的查询是:

SELECT * FROM table WHERE id IN (1,2,3,4);

我将其用于用户组,并且一个用户可以在多个组中。但是,当一条记录具有多个ID(例如1和3)时,mySQL不会返回该行。

有没有办法也能获得那排呢?


7
请发布无法从此查询正确返回的行的示例。假设您未将id逗号存储为以逗号分隔的列表或其他内容,查询中将返回多行。
Michael Berkowski 2012年

1
好吧,这是一个逗号分隔的列表,例如=> 3,4不会由mySQL返回。我看到了问题,这与逗号有关,但是我该怎么办呢?
netcase 2012年

1
@ user762683,请使用正确的配置文件名称?这个id,varchar或set或enum的数据类型是什么?
Starx'3

1
@Starx某人使用的个人资料名称是您的什么业务?
Michael Berkowski 2012年

1
@迈克尔,见轻松,如何正确发音是对应于OP作为netcase代替@user762683
Starx'3

Answers:


80

您的查询翻译成

SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4';

它只会返回与其匹配的结果。


解决它的一种避免复杂性的方法是将数据类型更改为SET。然后,您可以使用FIND_IN_SET

SELECT * FROM table WHERE FIND_IN_SET('1', id);

无法重现任何错误。请求的查询对我有用。我从具有列出ID的“表”中获取所有记录。
2015年

39

您的数据库设计错误,应该花一些时间阅读有关数据库规范化的内容(Wikipedia / stackoverflow)。

我认为你的桌子看起来像这样

TABLE
================================
| group_id | user_ids | name   |
--------------------------------
| 1        | 1,4,6    | group1 |
--------------------------------
| 2        | 4,5,1    | group2 |    

因此,在用户组表中,每一行代表一个组,在user_ids列中,您有一组分配给该组的用户ID。

该表的规范化版本如下所示

GROUP
=====================
| id       | name   |
---------------------
| 1        | group1 |
---------------------
| 2        | group2 |    

GROUP_USER_ASSIGNMENT
======================
| group_id | user_id |
----------------------
| 1        | 1       |
----------------------
| 1        | 4       |
----------------------
| 1        | 6       |
----------------------
| 2        | 4       |
----------------------
| ...      

然后,您可以轻松地选择具有分配的组的所有用户,或组中的所有用户,或所有用户组,或者您能想到的任何内容。另外,您的sql查询也可以使用:

/* Your query to select assignments */
SELECT * FROM `group_user_assignment` WHERE user_id IN (1,2,3,4);

/* Select only some users */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE user_id IN (1,4);

/* Select all groups of user */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`user_id` = 1;

/* Select all users of group */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`group_id` = 1;

/* Count number of groups user is in */
SELECT COUNT(*) AS `groups_count` FROM `group_user_assignment` WHERE `user_id` = 1;

/* Count number of users in group */
SELECT COUNT(*) AS `users_count` FROM `group_user_assignment` WHERE `group_id` = 1;

这样,更新数据库也变得更加容易,当您想添加新的工作分配时,您只需在其中插入新行group_user_assignment,而当您要删除工作分配时,只需删除行中group_user_assignment

在数据库设计中,要更新分配,您必须从数据库获取分配集,对其进行处理和更新,然后再写回数据库。

这是sqlFiddle可以使用的。


1

您必须在表或数据库中的数组记录中有记录。

例:

SELECT * FROM tabel_record
WHERE table_record.fieldName IN (SELECT fieldName FROM table_reference);

不需要子选择。IN (1,2,3,4)是完全有效的。另外,我不明白这如何解释“问题”中的“当记录具有多个ID(如1和3)时,mySQL不会返回该行”。
刮擦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.