我的查询是:
SELECT * FROM table WHERE id IN (1,2,3,4);
Run Code Online (Sandbox Code Playgroud)
我将它用于用户组,用户可以在多个组中.但似乎当一个记录有多个id如1和3时,mySQL不返回该行.
有没有办法获得那一行?
Sta*_*arx 72
您的查询转换为
SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4';
Run Code Online (Sandbox Code Playgroud)
它只会返回与之匹配的结果.
解决它的一种方法是避免复杂性,将数据类型转换为SET
.然后你可以使用FIND_IN_SET
SELECT * FROM table WHERE FIND_IN_SET('1', id);
Run Code Online (Sandbox Code Playgroud)
Buk*_*ksy 36
您的数据库设计错误,您应该花时间阅读有关数据库规范化的内容(维基百科/stackoverflow).
我假设你的桌子看起来有点像这样
TABLE
================================
| group_id | user_ids | name |
--------------------------------
| 1 | 1,4,6 | group1 |
--------------------------------
| 2 | 4,5,1 | group2 |
Run Code Online (Sandbox Code Playgroud)
因此,在用户组表中,每行代表一个组,在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 |
----------------------
| ...
Run Code Online (Sandbox Code Playgroud)
然后,您可以轻松选择具有已分配组的所有用户,或组中的所有用户,或所有用户组,或您可以想到的任何用户.此外,您的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;
Run Code Online (Sandbox Code Playgroud)
这样,更新数据库也会更容易,当你想添加新的赋值时,你只需要插入新行group_user_assignment
,当你想要删除赋值时,你只需要删除行group_user_assignment
.
在数据库设计中,要更新分配,您必须从数据库获取分配集,处理它并更新然后写回数据库.
这是sqlFiddle.
小智 6
您必须在数据库中的表或数组记录中有记录。
例子:
SELECT * FROM tabel_record
WHERE table_record.fieldName IN (SELECT fieldName FROM table_reference);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
291253 次 |
最近记录: |