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

时间:2019-02-21 21:07:28

标签: mysql5

我出售在线课程以及零售课程的订阅。 我会带出最畅销计划/课程的“前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是我创建的用于维护数据库完整性的计划,称为“单次销售”。当couId不为空时,您还购买了单独的课程,而不是可以参加任何课程的计划。

我的需求是:列出前5名的销售额。如果是计划,则显示计划名称(计划表,列标题)。如果是课程,则显示其名称(表格课程,colna couTitle)。我无法编码的逻辑。我能够将PLANS排在前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

如何进入该查询公式?

1 个答案:

答案 0 :(得分:0)

分组时,您可以使用:

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

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

def make_pdf_from_url(url, options=None):
    """Produces a pdf from a website's url.
    Args:
        url (str): A valid url
        options (dict, optional): for specifying pdf parameters like landscape
            mode and margins
    Returns:
        pdf of the website
    """
    return pdfkit.from_url(url, False, configuration=_get_pdfkit_config(), options=options)

def make_pdf_from_raw_html(html, options=None):
    """Produces a pdf from raw html.
    Args:
        html (str): Valid html
        options (dict, optional): for specifying pdf parameters like landscape
            mode and margins
    Returns:
        pdf of the supplied html
    """
    return pdfkit.from_string(html, False, configuration=_get_pdfkit_config(), options=options)

在这种情况下,我选择GROUP BY CASE WHEN sp.plaId = 1 THEN -1 ELSE sp.couId END 作为“单一计划”的分组。您可以将值替换为与任何-1不匹配的其他值。