mysqlsqlsubquerycorrelated-subquerymysql-error-1054

Get parent column in 3rd-level subquery


How can I get a column from the top-most parent query in a subquery within a subquery? Do I have to pass it like a variable? Here's my code:

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

The response I get is "Error Code: 1054. Unknown column 'c.in_customer_id' in 'where clause'"


Solution

  • As a principle, you want to move the sub-queries in to your FROM clause.

    Try something like this...

     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