首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql中,先按日期和时间排序,再按名称分组

在mysql中,先按日期和时间排序,再按名称分组
EN

Stack Overflow用户
提问于 2011-07-04 21:21:57
回答 11查看 129K关注 0票数 70

我有一张这样的桌子:

代码语言:javascript
复制
name    date         time
tom | 2011-07-04 | 01:09:52
tom | 2011-07-04 | 01:09:52
mad | 2011-07-04 | 02:10:53
mad | 2009-06-03 | 00:01:01

我想把最老的名字放在前面:

代码语言:javascript
复制
SELECT * 
ORDER BY date ASC, time ASC 
GROUP BY name

(->不起作用!)

现在,它应该首先给我mad(具有更早的日期),然后是tom

但是对于GROUP BY name ORDER BY date ASC, time ASC,首先给我的是较新的mad,因为它在排序之前进行分组!

再说一次:问题是我不能在分组之前按日期和时间排序,因为分组依据必须在排序依据之前!

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-12-17 08:20:13

另一种方法:

代码语言:javascript
复制
SELECT * 
FROM (
    SELECT * FROM table_name
    ORDER BY date ASC, time ASC 
) AS sub
GROUP BY name

GROUP BY GROUP在它命中的第一个匹配结果上。如果第一个匹配的命中结果恰好是您想要的,那么一切都应该按预期进行。

我更喜欢这种方法,因为子查询具有逻辑意义,而不是使用其他条件。

票数 94
EN

Stack Overflow用户

发布于 2016-02-04 21:48:27

由于我不被允许对用户1908688的回答发表评论,这里给MariaDB用户一个提示:

代码语言:javascript
复制
SELECT *
FROM (
     SELECT *
     ORDER BY date ASC, time ASC
     LIMIT 18446744073709551615
     ) AS sub
GROUP BY sub.name

https://mariadb.com/kb/en/mariadb/why-is-order-by-in-a-from-subquery-ignored/

票数 57
EN

Stack Overflow用户

发布于 2011-07-04 21:39:06

我想这就是你想要的:

代码语言:javascript
复制
SELECT name, min(date)
FROM myTable
GROUP BY name
ORDER BY min(date)

目前,您必须通过STR_TO_DATE创建一个mysql日期:

代码语言:javascript
复制
STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s')

所以:

代码语言:javascript
复制
SELECT name, min(STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s'))
FROM myTable
GROUP BY name
ORDER BY min(STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s'))
票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6572110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档