【问题标题】:Get parent column in 3rd-level subquery在第三级子查询中获取父列
【发布时间】:2019-04-10 02:19:23
【问题描述】:

如何从子查询中的子查询的最顶层父查询中获取列?我必须像变量一样传递它吗?这是我的代码:

SELECT c.in_customer_id, 
( 
     SELECT
         group_concat(the_schedule separator '\r\n') 
     FROM
     ( 
         SELECT
             concat_ws('\n', 'Route: ', s.route_id, 'Interval: ', s.service_interval, 'Week No.: ', s.week_no, 'Weekdays: ', s.weekdays, 'Start Date: ', s.start_date, 'End Date: ', s.end_date, 'Start Time: ', s.start_time, 'End Time: ', s.end_time, '\n') AS the_schedule
         FROM
             schedule s 
         WHERE
             s.service_address_id IN 
             ( 
                 SELECT in_customer_address_id 
                   FROM   tbl_customer_address a2 
                  WHERE  a2.in_customer_id = c.in_customer_id
             ) 
             AND s.is_skipped = '0'
         GROUP BY
             s.service_address_id
     ) a
 )
     AS "Schedule"
 FROM
     tbl_customers c

我得到的响应是“错误代码:1054。'where 子句'中的未知列'c.in_customer_id'”

【问题讨论】:

  • @MatBailie 我只发布了子查询。
  • 更重要的是,你投票了吗? ;)
  • 是的 - 佛罗里达需要你!
  • 你也可以尝试创建一个带有时间表的 CTE 并将其加入到客户表中,我认为它会更容易阅读
  • @MikeTwc - MySQL 标签除外... (MySQL 8 有 CTE,但它仍然相对不常用。)

标签: mysql sql subquery correlated-subquery mysql-error-1054


【解决方案1】:

原则上,您希望将子查询移入您的FROM 子句。

试试这样的...

 SELECT
    c.in_customer_id,
    s.grouped_schedule
 FROM
    tbl_customers   AS c
 LEFT JOIN
 (
    SELECT
       in_customer_id,
       group_concat(the_schedule separator '\r\n') AS grouped_schedule
    FROM
    (
       SELECT
          a.in_customer_id,
          a.in_customer_address_id,
          concat_ws('\n', 'Route: ', s.route_id, 'Interval: ', s.service_interval, 'Week No.: ', s.week_no, 'Weekdays: ', s.weekdays, 'Start Date: ', s.start_date, 'End Date: ', s.end_date, 'Start Time: ', s.start_time, 'End Time: ', s.end_time, '\n') AS the_schedule
       FROM
          tbl_customer_address  AS a
       INNER JOIN
          schedule              AS s
             ON s.service_address_id = a.in_customer_address_id
       WHERE
          s.is_skipped = 0
    )
       AS schedules
    GROUP BY
       in_cusomer_id
)
   AS s
      ON s.in_customer_id = c.in_customer_id

【讨论】:

  • 我很确定你实际上可以在没有子查询的情况下做到这一点,但希望这展示了一个有用的模式,当子查询有用时。
  • 另外,这是一个演示,表明您正在尝试的方法在 MySQL 中有效但只有一层深度sqlfiddle.com/#!9/2b519c/2
  • 第一个子查询返回多个 in_customer_id 导致错误“错误代码:1241。操作数应包含 1 列”。
  • 您是完全按原样运行它,还是将其用作另一个查询中的子查询? (我知道子查询会返回多个客户,他们应该这样做。它们也是行,而不是列。您的错误指的是列,这让我怀疑您如何使用它。)
  • @MatBailie 您说“作为原则”,但它应该与 3 级子查询一起使用吗?我之所以问,是因为似乎在第二级看到了父母,但在第三级没有看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多