Невозможно получить доступ к внешней таблице из производной таблицы (упрощенно, это любой «подзапрос», требующий псевдонима, в вашем случае g
и a
).
Вы должны выполнить необходимую операцию на внешнем уровне с помощью join
.Для этого вам нужно отследить o.code_id
и передать его на внешний уровень:
SELECT codes.id, sum_date_ranges.sum_date_ranges
FROM codes
JOIN
(SELECT a.code_id, SUM( ... ) as sum_date_ranges
(SELECT g.code_id, g.group_id, MIN( ... ), MAX( ... )
FROM ( SELECT o.code_id, @group_id = ...
FROM dates_range o ...
-- WHERE o.code_id = codes.id -- not required
ORDER BY o.code_id, o.start_date
) g
GROUP BY g.code_id, g.group_id
) a
GROUP BY a.code_id
) as sum_date_ranges
ON sum_date_ranges.code_id = codes.id
-- the rest of your joins and where-conditions
Возможно, вам потребуется адепт @group_id = ...
, чтобы перезапускать с 0 для каждого нового o.code_id
, но поскольку вы, кажется, нигде не используете абсолютное значение, это, вероятно, не имеет значения.
Это оценит полную производную таблицу для каждого code_id
, а затем выбросит все, что ему не нужно(которая может или не может быть значительной частью ваших данных).Чтобы предотвратить это, вы можете вместо этого фактически поместить внешние условия в запрос:
SELECT sum_date_ranges.code_id as id, sum_date_ranges.sum_date_ranges
-- from codes -- not required anymore, we get codes.id from derived table
FROM
(SELECT a.code_id, SUM( ... ) as sum_date_ranges
(SELECT g.code_id, g.group_id, MIN( ... ), MAX( ... )
FROM ( SELECT o.code_id, @group_id = ...
FROM dates_range o ...
WHERE o.code_id IN (SELECT codes.id
FROM codes
-- your join and where-conditions
)
ORDER BY o.code_id, o.start_date
) g
GROUP BY g.code_id, g.group_id
) a
GROUP BY a.code_id
) as sum_date_ranges
-- optionally in case you need other columns from codes
-- JOIN codes ON codes.id = sum_date_ranges.code_id
Это предполагает, что вам действительно нужен только столбец codes.id
из codes
(и что ваши joins
не умножаютсяваши строки), но ваш запрос мог бы быть упрощен в этом отношении, поэтому вы, конечно, все равно можете снова присоединиться к codes
(и другим таблицам), чтобы получить нужные вам столбцы (но здесь вам не нужно условие where
)больше).
Возможно, может полностью переписать ваш запрос без производной таблицы, но это, вероятно, потребует большого количества модификаций и вряд ли будет работать с переменными.Вероятно, это будет проще всего, если вы начнете с нуля (и если вам нужна помощь с этим, вам потребуется предоставить полный запрос, пример данных, ожидаемый результат и некоторое объяснение того, что должен делать ваш код).В частности, если вы используете MySQL 8, вы, вероятно, можете использовать оконные функции вместо переменных для получения такого ранжирования, сумм, первых и последних значений, хотя, похоже, вам все равно понадобится производная таблица.