MySQL - 排名前 5 的畅销计划或课程

Posted

技术标签:

【中文标题】MySQL - 排名前 5 的畅销计划或课程【英文标题】:MySQL - Top 5 rank best seller plans or courses 【发布时间】:2019-07-15 21:46:00 【问题描述】:

我出售我的在线课程以及零售课程的订阅。 我会带来畅销计划/课程的“前 5 名”。为此,我有一个名为“subscriptionPlan”的表,它存储购买的计划 ID,或者在课程的情况下,课程 ID 以及在此交易上花费的金额。示例:

表订阅计划

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 列)。如果是课程,则显示其名称(table course、colna couTitle)。我无法编码的这个逻辑。我能够在计划的前 5 名中排名,但它对课程进行了分组,因为 GROUP BY 是按计划的 ID。我相信恶作剧就在这里,也许在这个 GROUPBY 中创建一个 IF / ELSE,但我不知道该怎么做。

我编写的查询排名前 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

我怎样才能进入这个查询公式?

【问题讨论】:

什么版本的 mysql? 5.x 还是 8.x? 5.x,@TheImpaler! 【参考方案1】:

分组时可以使用:

简单的列,或 任何 [复杂] 表达式。

在您的情况下,您似乎需要按表达式分组,例如:

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

在这种情况下,我选择-1 作为“单一计划”的分组。您可以替换与任何 couId 不匹配的任何其他值。

【讨论】:

以上是关于MySQL - 排名前 5 的畅销计划或课程的主要内容,如果未能解决你的问题,请参考以下文章

steam周销榜:国产模拟建造游戏《戴森球计划》第四

空降Steam畅销榜,独立游戏《戴森球计划》有什么好玩的?

51CTO 企业IT学院更新说明-2018-02-06

MySQL从入门到精通50讲(三十五)-执行计划详解

MySQL从入门到精通50讲(三十五)-执行计划详解

大数据学习 or 复习计划:根据云和+达内+千锋课程内容整理