所以我有一个我正在处理的复杂的用户系统,我试图找出用户所属的组,以及所有这些组是否都处于锁定状态。
以下是我正在使用的架构的基础知识。
用户
+--------+
| userId |
+--------+
| 1 |
+--------+
| 2 |
+--------+
user_groups
+--------+---------+
| userId | groupId |
+--------+---------+
| 1 | 100 |
+--------+---------+
| 2 | 200 |
+--------+---------+
| 2 | 300 |
+--------+---------+
基
+---------+---------+
| groupId | locked |
+---------+---------+
| 100 | 1 |
+---------+---------+
| 200 | 1 |
+---------+---------+
| 300 | 0 |
+---------+---------+
所以在这个例子中,用户2属于组200和300。
组200被锁定,而组300则没有。
我正在寻找的是用户列表,他们的群组(用逗号分隔),以及他们的所有群组是否都被锁定。
+--------+----------+--------+
| userId | groupIds | locked |
+--------+----------+--------+
| 1 | 100 | 1 |
+--------+----------+--------+
| 2 | 200, 300 | 0 |
+--------+----------+--------+
我写的查询选择了group.locked
,但这只能告诉我连接选择的第一个组的状态,对吧?我也不相信我正确使用分组。
select
users.userId,
group_concat(groups.groupId) groupIds,
group.locked
from users
left join user_groups
on user_groups.userId = users.userId
left join groups
on groups.groupId = user_groups.groupId
group by groups.groupId
答案 0 :(得分:4)
您可以使用min
- 如果存在一个0
(已解锁),则结果为0
,如果所有这些都为1
(已锁定),结果将是1
:
select users.userId,
group_concat(groups.groupId) groupIds,
min(group.locked)
from users
left join user_groups
on user_groups.userId = users.userId
left join groups
on groups.groupId = user_groups.groupId
group by users.userId
(请注意,分组应该由userId
完成,而不是gorupId
)
答案 1 :(得分:1)
替代最小逻辑:
让我们为此添加另一个联接以发现已锁定。这是一个简单的脚本,用于挑选至少具有一个未锁定user_group的用户
select user_groups.userID
from user_groups ug
inner join groups
on groups.groupId = user_groups.groupId
where locked = 0
group by user_groups.userid
将两个语句与左连接和一个案例组合以读取锁定状态
select
users.userId,
group_concat(groups.groupId) groupIds,
case when a.user_ID is null then 1 else 0 end
from users
left join user_groups
on user_groups.userId = users.userId
left join groups
( select user_groups.userID
from user_groups ug
inner join groups
on groups.groupId = user_groups.groupId
where locked = 0
group by user_groups.userid
) a ona.userID = users.userID
on groups.groupId = user_groups.groupId
group by groups.userID
老实说......最小逻辑可能更好......这是where(子查询)中的左连接版本,它在mysql上工作得更好。