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 的畅销计划或课程的主要内容,如果未能解决你的问题,请参考以下文章