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, но таким образом я получу запись для каждого товара каждого купона, а мне нужна только одна запись для купона. Кто-нибудь может мне с этим помочь? Я разместил пример БД на скрипке, чтобы вы могли попробовать.

Спасибо

Если вы не хотите использовать его в группе, вам следует ограничить результат одним. Например, используя функции MAX или MIN. Смотрите обновленную Рабочая рабочий пример

Ergest Basha 06.08.2024 09:42

@Akina, в сообщении есть номер 3 (это первая таблица) и номер 5 (в конце есть ссылка на dbfiddle)

Gregory Farias 06.08.2024 16:48

сообщение имеет № 3... и № 5. Исходные данные в файле и при условии, что желаемый результат не соответствует. Тогда как они должны совпадать ПОЛНОСТЬЮ.

Akina 06.08.2024 18:32

Нет смысла не группировать по неагрегированным столбцам. Если у вас разные значения этих столбцов, какой из них выбрать?

Eric 06.08.2024 20:29

@Akina, как мои желаемые выходные данные и выходные данные скрипки могут совпадать, если я не могу заставить запрос работать так, как задумано? Иначе зачем мне вообще задавать вопрос? В предоставленной скрипте 100 записей. Как я могу опубликовать такую ​​длину на этой платформе? Представленный здесь DML и тот, что в скрипке, одинаковы, и оба они приводят к одной и той же ошибке, поэтому выходные данные совпадают.

Gregory Farias 07.08.2024 00:40

как мой желаемый результат и результат скрипки могут совпадать, если я не смогу заставить запрос работать так, как задумано? Вы должны показать выходные данные, которые вы ХОТИТЕ получить для предоставленных исходных данных, и эти выходные данные не должны быть «похожими», они должны соответствовать исходным данным.

Akina 07.08.2024 06:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
7
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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».

См. Обработка MySQL GROUP BY.

Schwern 06.08.2024 02:54

Другие вопросы по теме