Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL嵌套联接_Mysql_Sql_Join_Database Design - Fatal编程技术网

Mysql SQL嵌套联接

Mysql SQL嵌套联接,mysql,sql,join,database-design,Mysql,Sql,Join,Database Design,我有一个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' 'San

我有一个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;
它似乎只输出
角色
表中第一个
用户id
的角色。并且它输出了超过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
...

在这一点上,我不确定是我的表结构有缺陷,还是我使用了不正确的连接,或者是它加上了一些我甚至不知道的其他东西。有人能帮我指出正确的方向吗?

你可以像下面这样使用
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;

您可以像下面那样使用
独特的

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;

使用
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

使用
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
尝试使用下面的查询

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;
尝试使用下面的查询

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;

盯着你的查询:
ON Roles.rn\u id=Roles.role\u id

这不是你的意思

以下是固定查询(格式更清晰):

提示:许多:许多映射表(您的
角色
)通常根据其相关的两个事物命名。所以我建议
用户角色
。然后第三个表可以是简单的
角色
。这导致了

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

盯着你的查询:
ON Roles.rn\u id=Roles.role\u id

这不是你的意思

以下是固定查询(格式更清晰):

提示:许多:许多映射表(您的
角色
)通常根据其相关的两个事物命名。所以我建议
用户角色
。然后第三个表可以是简单的
角色
。这导致了

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


因此,该查询为同一用户生成了3条记录(他担任的每个角色1条)。其余的用户不会返回。在有重复映射之前,您不应该使用DISTINCT。您可以共享一些示例数据吗,因为您的查询看起来非常好。在未定义任何行限制数据之前,添加到OPS的示例数据应提供正确的输出。您是否使用示例数据测试了查询。因此,该查询为同一用户生成了3条记录(他担任的每个角色1条记录)。其余的用户不会返回。在有重复映射之前,您不应该使用DISTINCT。您可以共享一些示例数据吗,因为您的查询看起来非常好。在未定义任何行限制数据之前,添加到OPS的示例数据应提供正确的输出。您是否使用示例数据测试了查询。因此,该查询为同一用户生成了3条记录(他担任的每个角色1条记录)。其余的用户不是returned@Daveh0使用left join@Zaynul Abadin Tuhin-这越来越近了-现在其他用户的名字被返回,但是他们的
角色名显示为
NULL
。第一个用户显示正确。@Daveh0共享样本数据集,并输出它如何生成空值,这很难理解。我已将样本数据添加到OP中,以下是您的查询输出:
[{first_name:'Chris',role_name:'employee'},{first_name:'Chris',role_name:'admin'},{first_name:'Chris',role_name:'exec'},{first_name:'Bran',role_name:'employee'},{first_name:'Brian',role_name:'NULL},{first_name:'Jen',role_name:NULL}]
因此,该查询为同一用户生成了3条记录(他拥有的每个角色1条)。其他用户不是returned@Daveh0使用left join@Zaynul Abadin Tuhin-这越来越近了-现在其他用户的名称被返回,但他们的
角色名称显示为
NULL
。第一个用户显示正确。@Daveh0共享示例数据集,否则它将输出如何生成NULLgh为了理解,我已经向OP中添加了示例数据,下面是您的查询输出:
[{first_name:'Chris',role_name:'employee'},{first_name:'Chris',role_name:'exec'},{first_name:'Bran',role_name:'employee'},{first_name:'Brian',role_name:'NULL},{first_name:'Jen',role_name:'NULL}]
因此,该查询为同一用户生成了3条记录(他担任的每个角色有1条记录)。其余用户不返回,现在只显示1个用户的结果:
[{first_name:'Chris',role_name:'employee'},{first_name:'Chris',role_name:'admin'},{first_name:'Chris role_name:'exec'}]
,您错过了上一个关于
子句的
中的错误。因此,该查询为同一用户生成了3条记录(他担任的每个角色各1条)。其余用户未返回。现在它只显示了1个用户的结果:
[{first\u name:'Chris',role\u name:'employee'},{first\u name:'Chris role\u name:'admin'},{first_name:'Chris',role_name:'exec'}]
,您错过了上一个
ON
子句中的错误。