Список идентификаторов в групповом запросе
Я хочу вернуть строку для каждого кластера данных с уникальными amount
, operation
, months
и fee
для данного идентификатора.
Таблица выглядит следующим образом:
![enter image description here]()
Я могу почти получить то, что хочу,
SELECT amount, operation, months, fee, plan_id
FROM promo_discounts
WHERE promo_id = 1
GROUP BY amount, operation, months, fee
Что получится:
![enter image description here]()
Но заметьте, что он возвращает только plan_id
, когда я хочу, чтобы он возвращал что-то вроде 1, 2, 3
Возможно ли это?
Ответы
Ответ 1
Вы можете использовать GROUP_CONCAT
SELECT amount, operation, months, fee,
GROUP_CONCAT(DISTINCT plan_id SEPARATOR ',') AS plan_id
FROM promo_discounts
WHERE promo_id = 1
GROUP BY amount, operation, months, fee
Помните, что максимальная длина по умолчанию равна 1024, поэтому, если вы делаете это с большой таблицей, вы можете иметь усеченные значения...
Ответ 2
Посмотрите на функцию group_concat().
SELECT *, GROUP_CONCAT(id SEPARATOR ",") AS grouped_ids FROM table
Ответ 3
То, что я придумал при решении этой проблемы, заключается в объединении результата group by
с той же таблицей в полях группы. Обратите внимание, что оператор WHERE
одинаковый для обоих элементов
SELECT plan_id
FROM promo_discounts pd
JOIN (SELECT amount, operation, months, fee
FROM promo_discounts
WHERE promo_id = 1
GROUP BY amount, operation, months, fee
) AS grup ON pd.amount = grup.amount
AND pd.operation = grup.operation
AND pd.months = grup.months
AND pd.fee = grup.fee
WHERE promo_id = 1
Теперь вы можете играть с результатом, чтобы получить именно то, что вы хотите
Ответ 4
Я бы не рекомендовал GROUP_CONCAT, если вам нужно что-то динамическое.
GROUP_CONCAT имеет предел.
То, что вы можете сделать, это использовать временную таблицу, в которой вы можете сначала выбрать все строки, а затем получить свои сгруппированные результаты.
Чтобы получить идентификаторы, вы можете зацикливать группы и выбрать из таблицы temp предложение WHERE, которое имеет все группы как условие.
Я понимаю, что это может быть слишком сложно для такой вещи, но мне кажется, что это хорошее решение, если вам действительно нужно отслеживать идентификаторы.