【问题标题】:mysql group by and sort each groupmysql group by并对每个组进行排序
【发布时间】:2011-05-25 19:29:38
【问题描述】:

我有下表:

ID 名称时间
1 一个 0
2 一个 3
3 B 1

我正在使用下面的查询产生:

SELECT * FROM `table` GROUP BY `NAME`
ID 名称时间
1 一个 0
3 B 1

我想使用GROUP BY 生成这样的结果(按TIME 列的折扣排序):

ID 名称时间
2 一个 3
3 B 1

【问题讨论】:

  • 通过阅读您的问题,您不太清楚您希望如何对字段进行排序。
  • 目前还不是 100% 清楚你想要得到什么结果。或许尝试清楚地表达你真正想要做的什么
  • 但是如果我想让“order by”按自然顺序排列怎么办?

标签: mysql sql sorting group-by


【解决方案1】:
SELECT NAME, MAX(TIME) as TIME 
FROM table 
GROUP BY time 
ORDER BY time DESC

【讨论】:

  • 这实际上对我有用。与基于子查询的解决方案相比,它获得的信息更少,但速度更快。
  • 无法保证NAME 列与MAX(TIME) 来自同一行。考虑到上述数据或小数据集,它可能会很好地工作,但绝不是可靠的。有关详细讨论,请参阅stackoverflow.com/questions/14770671/…
  • 成功了!似乎只有ORDER BY 子句可以接受SELECT 子句中的别名,好技巧。
  • 同意 Rob Forrest 的评论。根据您的用例,您可能会通过此查询获得错误。
【解决方案2】:
 select * from (select * from table order by TIME DESC) t group by NAME

【讨论】:

  • 在我看来它不会正常工作,无论有没有 DESC,grupuping 总是一样的
【解决方案3】:

从这里http://www.cafewebmaster.com/mysql-order-sort-group 尝试这个解决方案,它也能解决我的问题 :)

示例:

SELECT * FROM 

(
select * from `my_table` order by timestamp desc
) as my_table_tmp

group by catid

order by nid desc

【讨论】:

    【解决方案4】:

    要获得每组时间最长的行,您可以使用自联接

    select a.*
    from demo a 
    left join demo b on a.NAME =b.NAME and a.TIME < b.TIME
    where b.NAME is null;
    

    select a.*
    from demo a 
    join (
      select NAME, max(`TIME`) as `TIME`
      from demo
      group by NAME
    ) b on a.NAME =b.NAME and a.TIME = b.TIME;
    

    Demo

    【讨论】:

      【解决方案5】:

      好吧,你必须决定你想在 ID 和 group by 之后的时间字段中看到什么。例如,我将选择 MAX(ID) 和 SUM(time),然后按 totaltime desc 排序。

      SELECT MAX(id), name, SUM(time) AS totaltime
      FROM YourTableName
      GROUP BY name
      ORDER BY totaltime DESC
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2018-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多