我的查询是:MySQL的WHERE IN()
SELECT * FROM table WHERE id IN (1,2,3,4);
我用它和用户组,用户可以在多个组。但似乎当一条记录具有多个id,如1和3时,mySQL不会返回该行。
有什么办法可以得到那一行吗?
我的查询是:MySQL的WHERE IN()
SELECT * FROM table WHERE id IN (1,2,3,4);
我用它和用户组,用户可以在多个组。但似乎当一条记录具有多个id,如1和3时,mySQL不会返回该行。
有什么办法可以得到那一行吗?
您的查询翻译成
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从'table'中获得所有记录。 – 2015-01-11 15:03:41
你有错误的数据库设计,你应该花时间阅读一些有关数据库标准化(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玩。
请发布一个不正确地从这个查询返回的行的例子。假设你没有将'id'作为逗号分隔的列表存储,你的查询会返回多行_will_。 – 2012-03-16 11:20:18
它是一个逗号分隔列表,例如=> 3,4不会由mySQL返回。我看到问题,这是关于逗号,但我怎么能这样做? – netcase 2012-03-16 11:23:54
@ user762683,请使用正确的配置文件名称?这个'id',varchar或set或enum的数据类型是什么? – Starx 2012-03-16 11:25:48