У меня есть запрос, который должен создать представление, которое будет использоваться для экспорта в виде файла 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
, но таким образом я получу запись для каждого товара каждого купона, а мне нужна только одна запись для купона. Кто-нибудь может мне с этим помочь? Я разместил пример БД на скрипке, чтобы вы могли попробовать.
Спасибо
Если вы не хотите использовать его в группе, вам следует ограничить результат одним. Например, используя функции MAX или MIN. Смотрите обновленную Рабочая рабочий пример
@Akina, в сообщении есть номер 3 (это первая таблица) и номер 5 (в конце есть ссылка на dbfiddle)
сообщение имеет № 3... и № 5. Исходные данные в файле и при условии, что желаемый результат не соответствует. Тогда как они должны совпадать ПОЛНОСТЬЮ.
Нет смысла не группировать по неагрегированным столбцам. Если у вас разные значения этих столбцов, какой из них выбрать?
@Akina, как мои желаемые выходные данные и выходные данные скрипки могут совпадать, если я не могу заставить запрос работать так, как задумано? Иначе зачем мне вообще задавать вопрос? В предоставленной скрипте 100 записей. Как я могу опубликовать такую длину на этой платформе? Представленный здесь DML и тот, что в скрипке, одинаковы, и оба они приводят к одной и той же ошибке, поэтому выходные данные совпадают.
как мой желаемый результат и результат скрипки могут совпадать, если я не смогу заставить запрос работать так, как задумано? Вы должны показать выходные данные, которые вы ХОТИТЕ получить для предоставленных исходных данных, и эти выходные данные не должны быть «похожими», они должны соответствовать исходным данным.
Вы хотите сгруппировать по «купону»: это означает, что вам нужна одна строка для каждого «купона».
Вы также хотите увидеть «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».
См. Советы по заданию хорошего вопроса о языке структурированных запросов (SQL), №5 и №3.