为多对多关系创建mysql视图

时间:2019-07-03 10:19:49

标签: mysql

MYSQL脚本创建一个MYSQL视图表,以通过多对多关系显示使用id,email和分配的角色名称

我编写了脚本,并加入了表以创建视图表,但是它仅显示其他用户具有角色的其他用户为空的第一条记录的角色名称!

表格

    users (id, email)
    roles (id, name)
    role_users (id, user_id, role_id)

我的脚本

    DROP VIEW IF EXISTS users_view;
    CREATE VIEW users_view AS
       SELECT users.id AS user_id, users.email, roles_names.role_name 
         FROM users
    LEFT JOIN(
        SELECT role_users.user_id AS roles_user_id,
               role_users.role_id AS roles_role_id
          FROM role_users
    ) AS user_roles ON (roles_user_id = users.id)
    LEFT JOIN(
           SELECT roles.id AS roleid, roles.name AS role_name 
            FROM  roles
     ) AS roles_names ON (roleid = user_roles.roles_user_id)

视图创建成功,但仅显示第一个用户的角色名称,其他用户的role_name值为null,尽管他们在role_users表中有记录

1 个答案:

答案 0 :(得分:1)

    SELECT u.id AS user_id, u.email, IFNULL(u_roles.role_name,'') as role_name 
      FROM users u 
 LEFT JOIN
        (SELECT GROUP_CONCAT(DISTINCT r.name SEPARATOR ',') as role_name, ur.user_id 
           FROM roles r INNER JOIN user_roles ur 
              ON r.id = ur.role_id 
       GROUP BY ur.user_id) u_roles 
              ON  u.id = u_roles.user_id

由于角色用户将只拥有角色表中的所有角色,因此可以进行角色内部联接和user_roles。 通过此查询,在user_roles表中具有条目的所有记录都将显示角色名称,其余用户将以null作为角色名称(添加IFNULL检查以使空值成为空字符串)< / p>