У меня есть запрос, который должен создать представление, которое будет использоваться для экспорта в виде файла 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
, но я не хочу агрегировать представление по этому полю. В результате я хочу получить одну строку для каждого «купона» и связанные с ним «элементы», объединенные в один столбец следующим образом:
но добавив programs.identifier
к GROUP BY
, я получаю следующее:
только две строки со всеми элементами следующим образом:
Я мог бы удалить GROUP BY
, но таким образом я получу запись для каждого товара каждого купона, а мне нужна только одна запись для купона. Кто-нибудь может мне с этим помочь? Я разместил пример БД на скрипке, чтобы вы могли попробовать.
Спасибо
🤔 А знаете ли вы, что...
SQL поддерживает агрегирование данных по времени с использованием функций DATE и TIME.
Вы хотите сгруппировать по «купону»: это означает, что вам нужна одна строка для каждого «купона».
Вы также хотите увидеть «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».