【问题标题】:Use an ORDER BY with a query that already has GROUP BY对已经具有 GROUP BY 的查询使用 ORDER BY
【发布时间】:2011-08-12 18:16:23
【问题描述】:

我正在使用 MySQL,并且我有一个在列中有日期的表(我正在为一个班级制作一个截止日期表)。以前我的查询如下:

SELECT * FROM duedates_f2011 ORDER BY anothercolumn

为了防止重复出现(基于到期日期列),我不得不将其更改如下:

SELECT * FROM duedates_f2011 GROUP BY duedate

目前,它保留了相同的订单,但我如何保证它仍然会这样做?我读过的GROUP BY 教程中没有任何内容表明它仍然会对其进行排序,并且之后添加ORDER BY 语句是不正确的。是我遗漏了什么,还是我应该添加其他东西以确保它保持有序?

(如我的标签所示,我正在使用 PHP 运行查询)

【问题讨论】:

  • ORDER BY 是您想要的,但由于与GROUP BY 相关的其他问题,它可能无法正常工作。您能否用这两个子句显示您的语句并指出SELECT 子句中包含哪些列?
  • 虽然GROUP BY 足以保证和排序(对于 MySQL),但我认为最好的做法是包含 ORDER BY 子句(这是允许的,并且是您想要的明确文档行以特定顺序返回。请注意,MySQL 与其他数据库引擎不同,后者不保证没有ORDER BY 子句的查询的结果集的顺序。(例如,我们观察到旧版本的 Oracle 在 GROUP 中返回行BY 顺序,但这是 group by 操作的副作用,不是保证。更高版本的 Oracle 不会按 GROUP BY 顺序返回行。)

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


【解决方案1】:
SELECT * FROM duedates_f2011 GROUP BY duedate ORDER BY anothercolumn;

这是根据MySQL manpages.

【讨论】:

  • 这个答案被否决了,但它似乎有效:S 也许是因为 Tomas Telensky 上面提到的原因。我决定只使用GROUP BY 方法。谢谢!
  • +1 这是一个很好的答案。最佳实践是包含ORDER BY 子句,即使在MySQL 中不需要它,因为MySQL 保证行将按GROUP BY 顺序返回。其他数据库没有同样的保证。
【解决方案2】:

先用分组选择,然后再按顺序,像这样?

SELECT * FROM
   (SELECT * FROM duedates_f2011 GROUP BY duedate) a
ORDER BY anothercolumn

我看不出有任何理由让您确定它是按分组列排序的。 大胆!需要更多的数据库!它应该屈服于你的每一个心血来潮!

mysql> SELECT Jump FROM YourDatabase;
+----------------+ 
| Jump           |
+----------------+
| How high?      |
+----------------+
1 row in set (0.00 sec)

【讨论】:

    【解决方案3】:

    您可以使用group by ... order by ...(按此顺序)。如果您只使用group by,它将按该列自动排序。

    但是,如果您想group by duedateorder by anothercolumn,请意识到一件事:当您按到期日期分组时,sql 不知道为另一列取哪个值...

    编辑:来自mysql manual

    如果使用 GROUP BY,输出行将根据 GROUP BY 排序 列,就好像您对相同的列有一个 ORDER BY。

    【讨论】:

    • 我相信如果它按我分组的列排序就足够了。谢谢!
    • mysql 不接受 order by ... group by 分组列的自动排序对我来说是新的(如果存在的话)
    • @guido 这是group by ... order by
    • @gms8994 这正是我要说的;现在删除的另一个问题也提出了相反的顺序,我发誓这在其他一些数据库中是否有效(我不知道)
    • @guido:如果您是新手,look in the manualgroup by .. order by 已修复,谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 2019-01-21
    • 1970-01-01
    • 2021-11-17
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多