繁体   English   中英

如何从第二级深度子查询中选择列?

[英]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具有到表Rolesid外键role_id 并且“表Roles具有到表“ Assignmentsrole_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_userSELECT部分(第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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM