2016-07-27 232 views
0

我有一个属于某个角色的用户列表。MYSQL:显示所有用户角色清单的查询

我有三个MySQL表:用户角色的UserRole这既涉及表。

对于“编辑用户”表单,我需要在角色表中显示所有可用角色的列表,并从中显示所有可用角色列表,以显示用户所属的列表。

我在查询中遇到问题,因为如果我尝试按角色名输出列表分组(避免重复),所有用户都不会出现在列表中。如果我避免分组,角色列表会有重复。 我试着用DISTINCT,输出仍然重复。

这里是我的查询:

SELECT roles.roleID, roles.nombreRol AS rolusuario, 
            usuarios.userID AS usuarioid, 
            rolesUsuarios.userID, rolesUsuarios.nombreRol 
          FROM roles LEFT JOIN rolesUsuarios 
          ON roles.nombreRol = rolesUsuarios.nombreRol 
          LEFT JOIN usuarios 
          ON rolesUsuarios.userID = usuarios.userID 


SELECT roles.roleID, roles.nombreRol AS rolusuario, 
            usuarios.userID AS usuarioid, 
            rolesUsuarios.userID, rolesUsuarios.nombreRol 
          FROM roles LEFT JOIN rolesUsuarios 
          ON roles.nombreRol = rolesUsuarios.nombreRol 
          LEFT JOIN usuarios 
          ON rolesUsuarios.userID = usuarios.userID 
          GROUP BY roles.nombreRol 

我也试着改变的任命为测试顺序:

      SELECT roles.roleID, roles.nombreRol, 
            usuarios.userID, 
            rolesUsuarios.userID, rolesUsuarios.nombreRol 
          FROM usuarios LEFT JOIN rolesUsuarios 
          ON usuarios.userID = rolesUsuarios.userID 
          LEFT JOIN roles 
          ON roles.nombreRol = rolesUsuarios.nombreRol 
GROUP BY roles.nombreRol 

但这样一来,我只得到一个结果列表其中有用户的角色。

这是我的三个表:

CREATE TABLE roles(
    roleID int unsigned not null auto_increment primary key, 
    nombreRol char(50) not null 
); 

CREATE TABLE usuarios(
    userID int unsigned not null auto_increment primary key, 
    userEmail char(50) null, 
... 
); 

CREATE TABLE rolesUsuarios (
    rolesUsuariosID int unsigned not null auto_increment primary key, 
    userID int not null, 
    nombreRol char(50) not null 
); 
+0

一个很好的经验法则是'从不使用逗号连接语法',并且绝对不会将它与常规连接语法结合使用 – Strawberry

回答

1

你应该能够刚刚从角色选择,左加盟的UserRole,过滤上userRoles.userID,并没有收到任何重复或需要使用不同的或分组尝试并消除它们。

如果userRoles的任何结果具有值,则选择角色并且应该检查该角色,如果该角色为空,则未选中该角色。

喜欢的东西:

select r.roleID, case when ru.userID is null then 'Unchecked' else 'Checked' end as checkbox 
from roles r 
left join rolesUsuarios ru 
on r.nombreRol = ru.nombreRol 
and ru.userID = ? 

更换?使用您正在筛选的当前用户标识的绑定参数。

如果您的nombreRol列的数据是健全的,它应该按原样工作,不需要任何其他聚合。

要显示其他查询(例如,所有用户,针对特定角色)的结果,我将使用单独的SQL,而不是使一个查询执行两个操作(如果这是您的目标)。

1

表的修改建议:

  1. 表rolesUsuarios应有角色ID为另一列,并将其设置在角色列外键roldeId。
  2. rolesUsuarios中的UserId列应该是外键,并指向usuarios表中的UserId。
  3. 角色Usuarios表中不需要rolesUsuariosID列。您可以将userId和RoleId组合在一起以创建主键。
  4. nombreRol已经存在于Roles表中,所以在角色Usuarios表中不需要。

您的查询应该是:

SELECT 
    roles.roleID 
    ,roles.nombreRol AS rolusuario 
    ,rolesUsuarios.userID 
FROM roles 
LEFT JOIN rolesUsuarios 
ON roles.nombreRol = rolesUsuarios.nombreRol 

假设:rolesUsuarios.nombreRol具有如roles.nombreRol列中的一个出现在角色表中的值相同。 如果您修改了表结构,那么上面的查询将会相应地改变,从而保持列被加入。