Подтвердить что ты не робот

Список идентификаторов в групповом запросе

Я хочу вернуть строку для каждого кластера данных с уникальными 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

Возможно ли это?

4b9b3361

Ответ 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, которое имеет все группы как условие. Я понимаю, что это может быть слишком сложно для такой вещи, но мне кажется, что это хорошее решение, если вам действительно нужно отслеживать идентификаторы.