MySQL WHERE IN()

我的查询是:

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

我将它用于用户组,并且用户可以位于多个组中。 但似乎当一个logging有多个像1和3的id,mySQL不会返回该行。

有没有办法得到这一行呢?

您的查询转换为

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

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


解决这个问题的一种方法是避免复杂性,将数据types改为SET 。 那么你可以使用FIND_IN_SET

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

你有错误的数据库devise,你应该花一些时间来阅读关于数据库规范化( 维基百科 / 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 | ---------------------- | ... 

然后,您可以轻松select所有已分配组的用户,或所有组中的用户或所有用户组,或者您可以想到的任何组。 此外,您的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行。

在你的数据库devise中,为了更新分配,你必须从数据库中获取你的任务集,处理它并更新,然后写回数据库。

这里是sqlFiddle来玩。