【问题标题】:Having both GROUP BY and ORDER BY in one query在一个查询中同时包含 GROUP BY 和 ORDER BY
【发布时间】:2016-09-16 16:36:05
【问题描述】:

有人告诉我,我不能在一个 MySQL 查询中使用 GROUP BY 和 ORDER BY。这是查询的缩写版本 -

SELECT n.colorName, n.colorComp, n.colorID, SUM(n.gallons) AS TotalGallons
FROM netTran n, Store m, Product p
WHERE ((n.store = m.store) and m.state = "FL")
AND ((n.salesNbr = p.salesNbr) AND (p.intExt = "EXTERIOR" OR p.intExt = "INT/EXT"))
AND ((n.clrnt1 = "L1") AND (n.clrnt1 = "R3"))
GROUP BY n.colorComp, n.colorID
ORDER BY TotalGallons DESC;

有人告诉我,使用 ORDER BY 和 GROUP BY 会给我带来不同的结果,并且 ORDER BY 起作用的唯一方法是主查询嵌套在

SELECT * FROM
(query)
ORDER BY TotalGallons DESC;

对吗?

【问题讨论】:

  • 不,这是不正确的。 ORDER BYGROUP BY 之后工作得很好;它会以不同的顺序为您提供相同的结果;获得不同结果的唯一方法是,如果你也有一个 LIMIT。事实上,如果你想要一些“总加仑数最多的三种颜色”,你会希望第一个查询也有 LIMIT 3

标签: mysql sql group-by sql-order-by


【解决方案1】:


将查询用作

SELECT n.colorName, n.colorComp, n.colorID, SUM(n.gallons) AS     TotalGallons
FROM netTran n, Store m, Product p
WHERE ((n.store = m.store) and m.state = "FL")
AND ((n.salesNbr = p.salesNbr) AND (p.intExt = "EXTERIOR" OR p.intExt = "INT/EXT"))
AND ((n.clrnt1 = "L1") AND (n.clrnt1 = "R3"))
GROUP BY n.colorName, n.colorComp,n.colorID
ORDER BY TotalGallons DESC;

您可以在单个查询中使用 grouo by 和 order by。但是你需要提供所有的列,以防你聚合一个列

【讨论】:

  • Order by 为您提供升序或降序的数据。 Group by 聚合列。希望你有一个想法,否则会解释清楚
  • 这更有意义。谢谢。
  • 如果您要重写查询,您应该 (1) 说明原因并 (2) 使用正确的 join 语法。
【解决方案2】:

Group by 会改变结果.. Order by 只会按顺序显示数据..

使用 ORDER BY 和 GROUP BY 不会给您带来不同的结果

【讨论】:

    【解决方案3】:

    是的,这是真的。在mysql reference manual你可以读到

    如果您使用 GROUP BY,输出行将根据 GROUP BY 列进行排序,就好像您对相同的列有一个 ORDER BY。为了避免 GROUP BY 产生的排序开销,添加 ORDER BY NULL:

    我想这意味着 ORDER BY 根本没有效果。

    很好奇...我一直认为该命令有效...

    【讨论】:

    • 我的猜测是 that ORDER BY 会覆盖 GROUP BY 的隐式排序,从而完全阻止 GROUP BY 进行排序。但是,他们警告说,GROUP BY 即使进行排序也是一种已弃用的行为,并且不认为它会在未来的版本中出现。
    【解决方案4】:

    GROUP BYORDER BY 是两个不同的东西。不能一起使用它们是完全错误的。

    GROUP BY 用于告诉 DBMS 按哪个组聚合数据。在您的示例中,您将 gallons per colorCompcolorID 相加。

    ORDER BY 用于告诉 DBMS 您希望数据显示的顺序。在您的查询中按gallons 的总和降序排列。

    在标准 SQL 中,您通常不会在没有 ORDER BY 的情况下使用 GROUP BY,因为尽管进行了分组,但数据可能显示为无序。然而,MySQL 决定保证GROUP BY 执行ORDER BY。因此,在 MySQL 中,没有必要在 GROUP BY 之后使用 ORDER BY,只要您不想像示例中那样 another 顺序。这种非标准行为现在已被弃用。见这里:

    https://dev.mysql.com/doc/refman/5.6/en/group-by-optimization.html

    但是,不推荐使用隐式 GROUP BY 排序。

    所以你现在应该有一个ORDER BY 子句,只要你想对数据进行排序。无一例外。

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多