MySQL просит добавить столбец в GROUP BY, который я не хочу использовать в GROUP BY

У меня есть запрос, который должен создать представление, которое будет использоваться для экспорта в виде файла CSV. Вот запрос:

CREATE OR REPLACE VIEW coupons_export AS
    SELECT
        coupons.code AS coupon,
        CONCAT('url.com/', programs.identifier, '/', coupons.code) AS url,
        GROUP_CONCAT(items.name) AS items,
        channels.name AS channel_name,
        programs.name AS program_name,
        SUM(coupon_stocks.current_quantity) AS current_quantity,
        SUM(coupon_stocks.sent_quantity) AS sent_quantity
    FROM
        coupons
    INNER JOIN
        channels ON coupons.channel_id = channels.id
    INNER JOIN
        coupon_stocks ON coupons.id = coupon_stocks.coupon_id
    INNER JOIN
        items ON coupon_stocks.item_id = items.id
    INNER JOIN
        programs ON coupon_stocks.program_id = programs.id
    WHERE
        coupons.channel_id = 1
    group by
        coupon

Проблема с этим запросом заключается в том, что MySQL выдает ошибку, говорящую, что мне нужно добавить programs.identifier к GROUP BY, но я не хочу агрегировать представление по этому полю. В результате я хочу получить одну строку для каждого «купона» и связанные с ним «элементы», объединенные в один столбец следующим образом:

купон URL предметы Название канала имя_программы текущее_количество отправленное_количество CSV2WGQH url.com/delivery/CSV2WGQH пункт 1, пункт 2 инстаграм доставка 3 0 CSVIFOQK url.com/delivery/CSVIFOQK пункт 1 инстаграм доставка 1 1 CSV5KSDF url.com/delivery/CSV5KSDF пункт 1, пункт 2 инстаграм доставка 3 3 ЧСВОСВАХ url.com/delivery/CSVOSVAH пункт 1, пункт 2 инстаграм доставка 3 3

но добавив programs.identifier к GROUP BY, я получаю следующее: только две строки со всеми элементами следующим образом:

купон URL предметы Название канала имя_программы текущее_количество отправленное_количество CSV2WGQH url.com/delivery/CSV2WGQH предмет 1, предмет 2, предмет 1, предмет 2, ... инстаграм доставка 5050 0 CSVIFOQK url.com/delivery/CSVIFOQK предмет 1, предмет 1, предмет 1, предмет 1, ... инстаграм доставка 5050 12

Я мог бы удалить GROUP BY, но таким образом я получу запись для каждого товара каждого купона, а мне нужна только одна запись для купона. Кто-нибудь может мне с этим помочь? Я разместил пример БД на скрипке, чтобы вы могли попробовать.

Спасибо

🤔 А знаете ли вы, что...
SQL поддерживает агрегирование данных по времени с использованием функций DATE и TIME.


2
72
1

Ответ:

Решено

Вы хотите сгруппировать по «купону»: это означает, что вам нужна одна строка для каждого «купона».

Вы также хотите увидеть «programs.identifier» (и «channels.name», «programs.name»). MySQL не знает, что делать, если обнаруживает более одного значения «programs.identifier» для данного «купона» (за исключением случаев, когда MySQL предполагает функциональные зависимости, см. ссылку @Schwern). Если вы знаете, что они никогда не меняются (т. е. «program.identifier» всегда один и тот же для каждого «купона»), то добавление его в GROUP BY — правильное действие. При этом запрашивается одна строка для каждой комбинации «купона» и «программ.идентификатора». С другой стороны, если вы знаете, что «program.identifier» может меняться для одного и того же «купона», и вы все равно хотите видеть одно значение «programs.identifier» для каждого «купона», и вам все равно, какое выбран «program.identifier», просто добавьте функцию агрегирования, например MIN/MAX, вокруг «program.identifier».

То же самое относится и к «channels.name», «programs.name».