【问题标题】:MySQL - using GROUP BY and DESCMySQL - 使用 GROUP BY 和 DESC
【发布时间】:2011-11-10 11:43:46
【问题描述】:

在我的 SQL 查询中,我使用 GROUP BYORDER BY 子句选择数据。该表在多行中具有相同的numbers,每行中的时间不同。所以我想我想应用一个 GROUP BY 子句。

但是在结果中返回最旧的时间和数字,但我需要最近的时间。

SELECT * FROM TABLE GROUP BY (numbers) ORDER BY time DESC

查询似乎应该首先应用 GROUP BY,然后应用 ORDER BY...,但结果似乎并非如此。

有没有办法解决这个问题?

【问题讨论】:

  • In the docs 如果您选择未分组的列,则在每个组有多个值的情况下,您将获得的行为明确称为“不确定”。你不能依赖任何特定的行为。你需要整行还是只需要numbers, max(time)
  • 能否提供一些数据行,结果符合你的预期?
  • 谢谢大家,你们让我走向了正确的方向。

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


【解决方案1】:
SELECT * 
FROM table t
WHERE time = (
    SELECT max(time)
    FROM table
    WHERE t.numbers = numbers
)

【讨论】:

  • 当我尝试在一个虚拟表上运行这个查询时,不知何故我最终得到了所有的行。但是,删除子查询中的 WHERE 对我有用。
【解决方案2】:

解决方法是将查询重写为:

SELECT * FROM (SELECT * FROM table ORDER BY time DESC) AS t GROUP BY numbers;

【讨论】:

  • 理论上你不能保证总是得到相同的结果。
  • @Karolis 同意,你的答案似乎更正确
  • 这使用了group by 的 MySQL 扩展,已明确记录不能可靠地工作:dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html
  • @GordonLinoff 我想这就是它对我不起作用的原因,谢谢你提到这一点
  • @GordonLinoff 链接已损坏。知道我应该寻找什么吗?谢谢
【解决方案3】:
SELECT * FROM table
    WHERE time IN (
        SELECT MAX(time)
            FROM table
            GROUP BY numbers
    )

【讨论】:

【解决方案4】:

根据手册,您可以按列表将 desc 添加到组中: 示例:
按 item1、item2 desc、item3 分组

有或没有汇总。

我已经尝试过了,它适用于 Ubuntu 5.5.58 版本。参考页面是: https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html

【讨论】:

    【解决方案5】:
    SELECT * FROM TABLE GROUP BY numbers DESC;
    

    这将为您提供组中的最后一条记录。

    谢谢

    【讨论】:

    • 这不能回答问题。他们想在分组之前订购。
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多