简体   繁体   English

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

[英]How to select column from 2nd level depth subquery?

I have found a few answers how to select a column from subquery, but it doesn't seem to be working if there is a subquery inside subquery. 我已经找到了一些如何从子查询中选择列的答案,但是如果子查询中有子查询,它似乎不起作用。

My table relationships are as follow (simplified, with example): 我的表关系如下(通过示例进行了简化):

Plans
| id | role_id
| --------------
| 4  | 2

Roles
| id | name
----------------
| 2  | Operator

Assignments
| role_name | user_id
| ---------------------
| Operator  | 12

Table Plans have foreign key role_id to table Roles column id . Plans具有到表Rolesid外键role_id And Table Roles have foreign key id to table Assignments column role_name . 并且“表Roles具有到表“ Assignmentsrole_name外键id

I'm writing a query that would select Plans but instead of role_id I would show user_id from table Assignments . 我正在写一个查询,会选择Plans ,但不是role_id我将显示user_id从表中Assignments

I'm pretty close with my current work but I'm stuck at final step: 我目前的工作与我非常接近,但仍停留在最后一步:

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)

Column assigned_user on SELECT part (line 1) is not found but I tried by adding alias inside of subquery SELECT . assigned_userSELECT部分(第1行)中没有找到但我试图通过添加里面的子查询别名SELECT How I can select base_assign.user_id ? 如何选择base_assign.user_id Note that I (most likely) cannot modify database structure as it was given like this in the first place. 请注意,我(很可能)无法修改数据库结构,因为它最初是这样给出的。

You are creating subqueries too excessively and you don't even need subqueries for this. 您创建的子查询过多,甚至不需要子查询。 Subqueries can be materialized by optimzer in MySQL which can cause performance issues. 子查询可由MySQL中的optimzer实现,这可能会导致性能问题。

See https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html 参见https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html

Try this using simple left join s: 使用简单的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;

You query wasn't working because you were not selecting the column while joining. 您的查询无效,因为您没有在加入时选择列。

Your somewhat "fixed" code: 您的“固定”代码:

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)

You don't need subqueries for this. 您不需要为此的子查询。 It is a little confusing what you are trying to do. 您正在尝试做的事情有点令人困惑。 The following will return all plans, even those with no roles and no assignments : 以下内容将返回所有计划,即使是没有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;

Subqueries are bad for two reasons. 子查询很糟糕,原因有二。 In MySQL, the are materialized. 在MySQL中,已实现。 That means extra overhead for reading and writing the tables. 这意味着读取和写入表会产生额外的开销。 Plus, you lose any indexes on them. 另外,您会丢失所有索引。

In your case, the subqueries just add layer upon layer of naming, and the names really do not help make your query more understandable. 在您的情况下,子查询只是添加了一层又一层的命名,而名称实际上并不能使您的查询更易于理解。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在同一选择语句中从第一张表的列值中选择第二张表的数据? - How to select data of 2nd table from column values of 1st table in same select statement? 如何在MySQL中选择两个表,但仅从第二个表中选择一列? - How can I select two tables in MySQL but only select one column from the 2nd table? mySQL 如何从第一个表中选择不同的(1 列:pruduct_Type)并从第二个表中选择 2 列 - mySQL How to select distinct(1 column : pruduct_Type) from 1st table and select 2 columns from 2nd table 如何从同一选择的第二张表中获取相关数据? - How to get related data from 2nd table in same select? 从MySQL中的最后一个条目中选择第二个 - Select 2nd From Last Entry In MySQL 如何从子查询中的 varchar 列中获取 select MAX - How to select MAX from varchar column in a subquery 如何选择2列中剩余字符的位置等于第二张表中2列的所有情况等于第二张表中另一列的某些值 - How select where left chars in 2 columns equal all cases of 2 columns in 2nd table that equal some value for another column in 2nd table 我如何从MySQL的每个组中选择第二行 - how can i select the 2nd row from every group from MySQL 如何从表中获得第二高? - How to get 2nd highest from table? Mysql - 如何根据第一个表的 2 列的值显示第二个表中的列? - Mysql - How to display column from 2nd table based on values from 2 columns of 1st table?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM