我找到了一些如何从子查询中选择列的答案,但如果子查询中有子查询,它似乎不起作用。
我的表关系如下(简化,举例):
Plans
| id | role_id
| --------------
| 4 | 2
Roles
| id | name
----------------
| 2 | Operator
Assignments
| role_name | user_id
| ---------------------
| Operator | 12
表Plans
有外键role_id
到餐 table Roles
栏目id
。和表Roles
有外键id
到餐 table Assignments
栏目role_name
.
我正在编写一个查询,该查询将选择 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 中的优化器可以具体化子查询,这可能会导致性能问题。
参见https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html
使用简单的左连接
尝试一下:
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)
关于mysql - 如何从二级深度子查询中选择列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43031888/