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

标签 mysql sql database

我找到了一些如何从子查询中选择列的答案,但如果子查询中有子查询,它似乎不起作用。

我的表关系如下(简化,举例):

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_userSELECT未找到部分(第 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/

相关文章:

php - 通过大学代理从本地 LAMP 连接到远程 MySQL 数据库

mysql - 从一张表中选择 : single-row subquery returns more than one row

mysql - 从签到日期列表中获取持续时间

Swift - 在 Firebase 数据库中存储计步器的日期

mysql - 除了默认安装在/var/lib/mysql 之外,我们如何安装 MySQL?

mysql - 归档MYSQL表数据的好方法?

mysql - 将存储为行的名称值对转换为列

mysql - 检索每个 ID 的最新记录。如何,在 SQL 中?

mysql - SQL 重复数据删除有帮助吗?

java - 我怎样才能取消?