使用group by和case when的Mysql查询

使用group by和case when的Mysql查询,mysql,group-by,case-when,Mysql,Group By,Case When,假设我在MySQL数据库中有三个这样的表 1. User(userId,name)2. Role(roleId,role)3. UserRoleMap(userRoleId,userId,roleId) 谢谢如能回答,我们将不胜感激 我不确定我的答案。不管怎样,我希望这能帮助你 SELECT A.name, C.role FROM `user` A JOIN userrolemap B ON A.`userId` = B.`userId` JOIN role C ON B.roleId =

假设我在MySQL数据库中有三个这样的表


1. User(userId,name)
2. Role(roleId,role)
3. UserRoleMap(userRoleId,userId,roleId)


谢谢如能回答,我们将不胜感激

我不确定我的答案。不管怎样,我希望这能帮助你

SELECT A.name, C.role
FROM `user` A
JOIN userrolemap B ON A.`userId` = B.`userId`
JOIN role C ON B.roleId = C.roleId
ORDER BY C.roleId, A.name
编辑

SELECT A.name, C.role
FROM `user` A
JOIN userrolemap B ON A.`userId` = B.`userId`
JOIN role C ON B.roleId = C.roleId
GROUP BY A.userId
ORDER BY FIELD( C.role, 3, 1, 2 ) , A.name
您可以使用
字段指定订单,如下所示

SELECT A.name, C.role
FROM `user` A
JOIN userrolemap B ON A.`userId` = B.`userId`
JOIN role C ON B.roleId = C.roleId
ORDER BY FIELD( C.role, 3, 1, 2 ),A.name
编辑

SELECT A.name, C.role
FROM `user` A
JOIN userrolemap B ON A.`userId` = B.`userId`
JOIN role C ON B.roleId = C.roleId
GROUP BY A.userId
ORDER BY FIELD( C.role, 3, 1, 2 ) , A.name

与其直接保存角色,不如采用另一种方法

为每个角色分配2的幂。 如: 用户-1 行政-2 主管4

如果一个用户有多个角色,您只需将它们相加即可。因此,当某个人既是用户又是主管时,您将在数据库中保存“5”

这使您的查询更加容易,因为现在您可以执行以下操作:

CASE
    WHEN role >= 1 THEN 'User'
    WHEN role >= 2 THEN 'Admin'
    WHEN role >= 4 THEN 'Supervisor'
END

最后我得到了解决方案
select user.name,
select user.name, 
case when (GROUP_CONCAT(role.role) like '%Admin%') then 
        'Admin'
    else
        case when (GROUP_CONCAT(role.role) like '%Supervisor%') then 
                'Supervisor'
            else
                case when (GROUP_CONCAT(role.role) like '%User%') then 
                        'User'
                end
          end
end as 'role'
from User user, Role role, UserRoleMap userRole where
user.userId = userRole.userId and
role.roleId = userRole.roleId
group by user.userId;
当(组_CONCAT(role.role)如“%Admin%”时的情况,然后
“管理员”
其他的
当(组_CONCAT(role.role)如“%Supervisor%”时的情况),然后
“主管”
其他的
当(组_CONCAT(role.role)如“%User%”时的情况,然后
“用户”
结束
结束
以“角色”结尾
来自用户、角色、用户角色映射用户角色,其中
user.userId=userRole.userId和
role.roleId=userRole.roleId
按user.userId分组;

你好,Shafeeq。。谢谢,但我说我通过查询得到了正确的结果。如果查询的性能符合要求,我想在条件中使用别名,其他明智的替代查询。嗨..@Shafeeq我很抱歉..我的结果也是错误的。。我编辑了我的问题。。如果可能的话,请帮助我Hi@Yoshi-谢谢,但我没有明白如何在查询中分配它。如果有机会的话,你能把整个问题写下来吗@Shafeeq.谢谢,但reoleId并不是每个角色都固定的。在实际情况中,它和我在示例中给出的数字不同。但我想查询上面例子中提到的三个角色。所以如果John有两个角色,你只需要显示一个角色?或者你想以特定的顺序显示它,比如角色顺序为1,2,3或2,1,3,这就是你想要的吗?两个角色中只有一个角色。但那必须是最高的角色见上面的角色顺序。。它是预定义的..假设一个用户是'Admin'和'user'。然后,结果中必须包含具有管理员角色的用户..现在得到了吗?它为一个用户提供了所有角色..我们必须选择最高的一个。所以我们必须在那里添加GROUPBY子句。 select user.name, case when (GROUP_CONCAT(role.role) like '%Admin%') then 'Admin' else case when (GROUP_CONCAT(role.role) like '%Supervisor%') then 'Supervisor' else case when (GROUP_CONCAT(role.role) like '%User%') then 'User' end end end as 'role' from User user, Role role, UserRoleMap userRole where user.userId = userRole.userId and role.roleId = userRole.roleId group by user.userId;