[英]How to select data of 2nd table from column values of 1st table in same select statement?
[英]How to select column from 2nd level depth subquery?
我已经找到了一些如何从子查询中选择列的答案,但是如果子查询中有子查询,它似乎不起作用。
我的表关系如下(通过示例进行了简化):
Plans
| id | role_id
| --------------
| 4 | 2
Roles
| id | name
----------------
| 2 | Operator
Assignments
| role_name | user_id
| ---------------------
| Operator | 12
表Plans
具有到表Roles
列id
外键role_id
。 并且“表Roles
具有到表“ Assignments
列role_name
外键id
。
我正在写一个查询,会选择Plans
,但不是role_id
我将显示user_id
从表中Assignments
。
我目前的工作与我非常接近,但仍停留在最后一步:
SELECT assigned_user, plan.id, plan.role_id
FROM `Plans` AS plan
LEFT JOIN (
SELECT roleTable.id, roleTable.name
FROM `Roles` AS roleTable
INNER JOIN (
SELECT base_assign.user_id AS assigned_user, base_assign.role_name
FROM `Assignments` AS base_assign) AS roleAssign
ON roleTable.name = roleAssign.role_name
) AS role
ON (plan.assignee_role = role.id)
柱assigned_user
上SELECT
部分(第1行)中没有找到但我试图通过添加里面的子查询别名SELECT
。 如何选择base_assign.user_id
? 请注意,我(很可能)无法修改数据库结构,因为它最初是这样给出的。
您创建的子查询过多,甚至不需要子查询。 子查询可由MySQL中的optimzer实现,这可能会导致性能问题。
参见https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html
使用简单的left join
s尝试以下操作:
select a.user_id as assigned_user,
p.id,
p.role_id
from `Plans` p
left join `Roles` r on p.assignee_role = r.id
left join `Assignments` a on r.name = a.role_name;
您的查询无效,因为您没有在加入时选择列。
您的“固定”代码:
select assigned_user,
plan.id,
plan.role_id
from `Plans` as plan
left join (
select roleAssign.assigned_user roleTable.id,
roleTable.name
from `Roles` as roleTable
inner join (
select base_assign.user_id as assigned_user,
base_assign.role_name
from `Assignments` as base_assign
) as roleAssign on roleTable.name = roleAssign.role_name
) as role on (plan.assignee_role = role.id)
您不需要为此的子查询。 您正在尝试做的事情有点令人困惑。 以下内容将返回所有计划,即使是没有roles
也没有assignments
:
SELECT b.user_id as assigned_user, p.id, p.role_id
FROM Plans p LEFT JOIN
Roles r
ON p.role_id = r.id LEFT JOIN
Assignments a
ON a.name = r.name;
子查询很糟糕,原因有二。 在MySQL中,已实现。 这意味着读取和写入表会产生额外的开销。 另外,您会丢失所有索引。
在您的情况下,子查询只是添加了一层又一层的命名,而名称实际上并不能使您的查询更易于理解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.