没有任何未锁定组的用户的标记

时间:2014-08-18 20:01:21

标签: mysql sql

所以我有一个我正在处理的复杂的用户系统,我试图找出用户所属的组,以及所有这些组是否都处于锁定状态。

以下是我正在使用的架构的基础知识。

用户

+--------+
| 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

2 个答案:

答案 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上工作得更好。