2012-03-16 81 views
48

我的查询是:MySQL的WHERE IN()

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

我用它和用户组,用户可以在多个组。但似乎当一条记录具有多个id,如1和3时,mySQL不会返回该行。

有什么办法可以得到那一行吗?

+6

请发布一个不正确地从这个查询返回的行的例子。假设你没有将'id'作为逗号分隔的列表存储,你的查询会返回多行_will_。 – 2012-03-16 11:20:18

+1

它是一个逗号分隔列表,例如=> 3,4不会由mySQL返回。我看到问题,这是关于逗号,但我怎么能这样做? – netcase 2012-03-16 11:23:54

+0

@ user762683,请使用正确的配置文件名称?这个'id',varchar或set或enum的数据类型是什么? – Starx 2012-03-16 11:25:48

回答

52

您的查询翻译成

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); 
+0

无法重现任何错误。请求的查询适用于我。我使用列出的ID从'table'中获得所有记录。 – 2015-01-11 15:03:41

22

你有错误的数据库设计,你应该花时间阅读一些有关数据库标准化(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玩。