Mysql SQL嵌套联接
我有一个mySQL数据库,我试图在其中输出一个用户列表及其分配的管理角色。我的桌子看起来像: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
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
子句中的错误。