MySQL - Лучшие 5 бестселлеров планы или курсы - PullRequest
0 голосов
/ 22 февраля 2019

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

таблица subscriptionPlan

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 - это план под названием «Single Sale», который я создал, чтобы сохранить целостностьБД.Когда 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

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

1 Ответ

0 голосов
/ 22 февраля 2019

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

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

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

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

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

...