查询相当于两个没有子查询的分组?

时间:2018-02-03 23:12:33

标签: mysql

我试图在用户ACL上运行报告。我们使用MYSQL,出于性能原因,我们禁止使用子查询。目标是转变:

    --------------------------------
    | userName | folderID | roleID |
    --------------------------------
    | gronk    |     1    |    1   |
    | gronk    |     2    |    2   |
    | gronk    |     4    |    2   |
    | tbrady   |     1    |    2   |
    | jedelman |     1    |    1   |
    | jedelman |     2    |    1   |
    | mbutler  |     1    |    2   |
    | mbutler  |     2    |    2   |
    | bill     |     1    |    3   |
    | bill     |     2    |    3   |
    | bill     |     3    |    3   |
    | bill     |     4    |    3   |
    --------------------------------

进入这个:

    ------------------------
    | Lowest Role | Number |
    ------------------------
    |      1      |    2   |
    |      2      |    2   |
    |      3      |    1   |
    ------------------------

我可以看到如何使用子查询来完成它。内部查询将使用min(roleID)在userName上执行分组。然后外部查询将按最低角色和计数(*)进行分组。但我不知道如何在没有子查询的情况下做到这一点。

另外,如果有帮助我创建了一个包含上述数据的SQL Fiddle

1 个答案:

答案 0 :(得分:0)

我找到了一个使用左连接的解决方案:

select UFM.roleID, count(distinct UFM.userName) 
from UserFolderMembership UFM
left join UserFolderMembership UFM2 on
    UFM.userName = UFM2.userName and
    UFM.roleID > UFM2.roleID
where
    UFM2.userName is null
group by 
    UFM.roleID