SQL - 嵌套的联接

问题描述 投票:1回答:4

我在这我想输出的用户及其分配,管理角色列表的MySQL数据库。我的表看起来是这样的:

Users:
-------
- id
- fname
- lname


Role_Names
-----------
- rn_id
- role_name


Roles
---------
- role_id
- user_id

这里的一些数据:

Users:
-------
1  'Chris'  'Christy'
2  'Brian'  'Bobson'
3  'Jen'    'Sanders'

Role_Names
--------------
1  'admin'
2  'exec'
3  'employee'

Roles
-----------
1   1
1   2
1   3
2   3
3   3
3   2

和我的查询,我使用:

SELECT Users.fname, Role_Names.role_name from Users INNER JOIN 
    Roles on Users.id = Roles.user_id
        INNER JOIN Role_Names
            ON Roles.rn_id = Roles.role_id;

它只是似乎是输出在user_id表第一Roles角色。而它的输出超过1相同的记录的。例如,我的输出如下:

first_name      role_name
--------------------------------------
Chris           exec
Chris           exec
Chris           exec
Chris           employee
Chris           employee
Chris           employee
Chris           admin
Chris           admin
Chris           admin

而我希望更多的东西,如:

first_name      role_name
--------------------------------------
Chris           employee
Chris           admin
Chris           exec
Brian           employee
Jen             employee
Jen             exec
...

在TIS一点上,我不知道,如果它是有缺陷,我的表结构,或者如果我使用不正确的连接,或者如果它是加了一堆其他的东西我甚至不知道。有人可以帮我指出了正确的方向?

mysql sql join database-design
4个回答
1
投票

使用distinct

with Users as
(
select 1 id, 'Chris' fname,  'Christy' lname
union all
select 2 , 'Brian',  'Bobson' union all
select 3  ,'Jen'  ,  'Sanders'
),Role_Names as
(
select 1 rn_id,  'admin' role_name
union all
select 2 , 'exec' union all
select 3 , 'employee'
) , Roles as
(
select 1 role_id,1 user_id
    union all
     select 1,2 union all
     select 1,3 union all
     select 2  , 3 union all
select 3  , 3 union all
select 3 ,  2
) SELECT distinct Users.fname, Role_Names.role_name 
  from Users left JOIN 
    Roles on Users.id = Roles.user_id
        left JOIN Role_Names
            ON Role_Names.rn_id = Roles.role_id

你错过了加盟查询

JOIN Role_Names ON Roles.rn_id = Roles.role_id -- here both side you use Roles

2
投票

盯着这块您查询:ON Roles.rn_id = Roles.role_id;

这不是你的意思!

这里是固定的查询(更清晰的格式):

SELECT  Users.fname, Role_Names.role_name
    FROM        Users AS u
    INNER JOIN  Roles AS r        ON u.id = r.user_id
    INNER JOIN  Role_Names AS rn  ON rn.rn_id = r.role_id

提示:很多:很多映射表(您Roles)通常由它涉及了两件事命名。因此,我建议User_Roles。然后第三个表可以简单地Roles。这导致

SELECT  Users.fname, Role_Names.role_name
    FROM        Users AS u
    INNER JOIN  User_Roles AS ur ON u.id = ur.user_id
    INNER JOIN  Roles      AS r  ON r.rn_id = ur.role_id

1
投票

您可以使用DISTINCT像以下。

SELECT DISTINCT Users.fname, Role_Names.role_name from Users INNER JOIN 
    Roles on Users.id = Roles.user_id
        INNER JOIN Role_Names
            ON Roles.rn_id = Roles.role_id;

0
投票

尝试使用下面的查询。

SELECT Users.fname, Role_Names.role_name 
from Roles RIGHT OUTER JOIN 
    Users on Users.id = Roles.user_id
        INNER JOIN Role_Names
            ON Roles_Names.rn_id = Roles.role_id;
© www.soinside.com 2019 - 2024. All rights reserved.