MySQL - Лучшие 5 бестселлеров планы или курсы

78
10

Я продаю подписки на мой онлайн-курс, а также курсы в розницу. Я бы принес "топ-5" самых продаваемых планов/курсов. Для этого у меня есть таблица с названием "subscriptionPlan", в которой хранится идентификатор приобретенного плана или, в случае курса, идентификатор курса и сумма, потраченная на эту транзакцию. Пример:

таблица подпискиPlan

sbpId | subId | plaId | couId | sbpAmount
1 | 1 | 1 | 1 | 499.99
2 | 2 | 1 | 2 | 499.99
3 | 3 | 2 | 0 | 899.99
4 | 4 | 1 | 1 | 499.99

Просто для образовательных целей, plaId = 1 - это план под названием "Единая продажа", который я создал для поддержания целостности БД. Когда couId не пуст, вы также купили отдельный курс, а не план, где вы можете посещать любой курс.

Моя потребность: перечислите 5 лучших продаж. Если это план, отобразите имя плана (таблица плана, столбец plaTitle). Если это курс, отобразите его название (таблица курс, colna couTitle). Это логика, которую я не могу кодировать. Я смог оценить топ-5 ПЛАНОВ, но он группирует курсы, так как GROUP BY по идентификатору плана. Я считаю, что шалость здесь, возможно, создание IF/ELSE в этом GROUPBY, но я не знаю, как это сделать.

Запрос, который я кодирую, чтобы оценить мои лучшие 5 планов:

SELECT sp.plaId, sp.couId, p.plaTitle, p.plaPermanent, c.couTitle, SUM(sbpAmount) AS sbpTotalAmount
FROM subscriptionPlan sp
LEFT JOIN plan p ON sp.plaId = p.plaId
LEFT JOIN course c ON sp.couId = c.couId
GROUP BY sp.plaId
ORDER BY sbpTotalAmount DESC
LIMIT 5

Результат, который я ожидал, был:

plaId | couId | plaTitle        | couTitle   | plaPermanent | sbpTotalAmount
1 | 1 | Venda avulsa | Curso 01 | true | 999.98
2 | 0 | Acesso total | null | false | 899.99
3 | 2 | Venda avulsa | Curso 02 | true | 499.99

Как я могу попасть в эту формулу запроса?

спросил(а) 2021-01-19T21:27:38+03:00 6 месяцев, 1 неделя назад
1
Решение
101

При группировании вы можете использовать:

    Простые столбцы или Любое [сложное] выражение.

В вашем случае кажется, что вам нужно сгруппировать по выражению, например:

GROUP BY CASE WHEN sp.plaId = 1 THEN -1 ELSE sp.couId END

В этом случае я выбрал -1 в качестве группировки для "Единого плана". Вы можете заменить значение на любое другое, которое не соответствует ни одному couId.

ответил(а) 2021-01-19T21:27:38+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема