【问题标题】:mySQL - get 2 most common itemsmySQL - 获取 2 个最常见的项目
【发布时间】:2014-02-20 21:56:10
【问题描述】:

您好,我有一个名为 items 的表格,如下所示:

items table

itemname | itemprice
---------------------
orange   | 0.50
pear     | 0.40
apple    | 0.40
banana   | 0.75

我还有一张记录每次销售的表格:

sales table

date     | itemname | qty
---------------------
17/12/13 | orange   | 4
22/12/13 | banana   | 6
23/12/13 | banana   | 2
29/12/13 | pear     | 3
02/01/14 | orange   | 2
05/01/14 | pear     | 6
05/01/14 | banana   | 5
06/01/14 | apple    | 2

我想要做的是获取最畅销的 2 件商品的商品名称和价格。所以查询应该返回:

itemname | itemprice
---------------------
banana   | 0.70
pear     | 0.40

我可以得到 2 个最常见的商品,但这是错误的,因为需要考虑数量而不是商品名称在销售表中的频率。

【问题讨论】:

    标签: mysql database phpmyadmin


    【解决方案1】:
    SELECT i.itemname, i.itemprice
    FROM items i
    JOIN sales s ON i.itemname = s.itemname
    GROUP BY s.itemname
    ORDER BY SUM(s.qty) DESC
    LIMIT 2
    

    SQL Fiddle

    如果您想符合 ANSI 标准,请将 GROUP BY 更改为

    GROUP BY i.itemname, i.itemprice
    

    【讨论】:

    • 我强烈建议不要使用非 ANSI GROUP BY 语法
    • @FreshPrinceOfSO 好的,你能解释一下原因吗?
    • @FreshPrinceOfSO 我希望能得到更多解释,说明您个人为什么不使用它。是的,它违反了 ANSI 标准。但你认为缺点是什么?您发布的链接并没有真正说明它为什么不好。更多的是人们争论 MySQL 为何会破坏 ANSI 标准。只要您了解 MySQL 在做什么并且您无法预测/控制非聚合字段的值(在这种情况下您不需要),我会看到的唯一缺点是它可以创建便携性问题。
    • 使用不能保证实际聚合哪些列的平台特定功能是一种糟糕的做法。如果这还不够,那么可移植性 一个大问题。如果您迁移到除 MySQL 之外的任何平台,您是否愿意重写查询?感谢您改进您的答案,尽管您现在所做的只是获得DISTINCT 结果。
    猜你喜欢
    • 2020-08-23
    • 2016-07-06
    • 2013-09-20
    • 2017-11-26
    • 2021-07-29
    • 1970-01-01
    • 2017-11-08
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多