排序-在MySQL中按GROUP BY名称之前的日期和时间排序

我有这样一张桌子:

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

我首先要最早的名字:

SELECT *

ORDER BY date ASC, time ASC

GROUP BY name

(->不起作用!)

现在它应该让我先发疯(早点约会),然后再发给汤姆

但是以GROUP BY name ORDER BY date ASC, time ASC给我先发狂,因为它在排序之前就聚集了!

再次:问题是我无法在分组之前按日期和时间排序,因为GROUP BY必须在ORDER BY之前!

9个解决方案

74 votes

另一种方法:

SELECT *

FROM (

SELECT *

ORDER BY date ASC, time ASC

) AS sub

GROUP BY name

GROUP BY在其找到的第一个匹配结果上进行分组。 如果第一个匹配命中恰好是您想要的匹配命中,那么一切都会按预期进行。

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

swbeeton answered 2019-12-28T06:43:24Z

26 votes

我认为这就是您要寻找的:

SELECT name, min(date)

FROM myTable

GROUP BY name

ORDER BY min(date)

对于时间,您必须通过STR_TO_DATE设置一个mysql日期:

STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s')

因此:

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'))

Cyril Gandon answered 2019-12-28T06:43:53Z

24 votes

由于不允许对user1908688的答案发表评论,因此以下是MariaDB用户的提示:

SELECT *

FROM (

SELECT *

ORDER BY date ASC, time ASC

LIMIT 18446744073709551615

) AS sub

GROUP BY sub.name

[https://mariadb.com/kb/zh-CN/mariadb/why-is-order-by-in-a-from-subquery-ignored/]

Vincent answered 2019-12-28T06:44:17Z

9 votes

这为我工作:

SELECT *

FROM your_table

WHERE id IN (

SELECT MAX(id)

FROM your_table

GROUP BY name

);

jokermt235 answered 2019-12-28T06:44:37Z

3 votes

使用子选择:

select name, date, time

from mytable main

where date + time = (select min(date + time) from mytable where name = main.mytable)

order by date + time;

Bohemian answered 2019-12-28T06:44:56Z

0 votes

对于这个问题,我有一个不同的变体,其中我只有一个DATETIME字段,并且在基于group by或distinct(基于datetime)进行降序排序之后,需要一个limit,但这对我有帮助:

select distinct (column) from

(select column from database.table

order by date_column DESC) as hist limit 10

在这种情况下,如果使用拆分字段,则可以对concat进行排序,那么您也许可以摆脱类似的情况:

select name,date,time from

(select name from table order by concat(date,' ',time) ASC)

as sorted

然后,如果您想限制,只需在末尾添加限制语句即可:

select name,date,time from

(select name from table order by concat(date,' ',time) ASC)

as sorted limit 10

AbsoluteƵERØ answered 2019-12-28T06:45:26Z

0 votes

解决此问题的另一种方法是使用LEFT JOIN,它可能更有效。 我首先从一个仅考虑日期字段的示例开始,因为将日期+时间存储在一个datetime列中可能更常见,并且我还希望保持查询简单,以便于理解。

因此,在此特定示例中,如果要基于日期列显示最旧的记录,并假定表名称为LEFT JOIN,则可以使用以下查询:

SELECT p.* FROM people p

LEFT JOIN people p2 ON p.name = p2.name AND p.date > p2.date

WHERE p2.date is NULL

GROUP BY p.name

LEFT JOIN所做的是,当LEFT JOIN列处于最小值时,左侧联接上将没有LEFT JOIN770,该列的最小值较小,因此对应的p2.date将为NULL。因此,通过添加WHERE p2.date is NULL,我们确保仅显示 日期最早的记录。

同样,如果要显示最新记录,则可以在LEFT JOIN中更改比较运算符:

SELECT p.* FROM people p

LEFT JOIN people p2 ON p.name = p2.name AND p.date < p2.date

WHERE p2.date is NULL

GROUP BY p.name

现在,对于这个特定的示例,其中date + time是单独的列,如果要基于合并的两列的datetime进行查询,则需要以某种方式添加它们,例如:

SELECT p.* FROM people p

LEFT JOIN people p2 ON p.name = p2.name AND p.date + INTERVAL TIME_TO_SEC(p.time) SECOND > p2.date + INTERVAL TIME_TO_SEC(p2.time) SECOND

WHERE p2.date is NULL

GROUP BY p.name

您可以在“保持某列的分组最高行数”页面上阅读有关此内容的更多信息(并查看实现此目的的其他方法)。

Ben answered 2019-12-28T06:46:09Z

0 votes

在Oracle中,这对我有用

SELECT name, min(date), min(time)

FROM table_name

GROUP BY name

Max answered 2019-12-28T06:46:29Z

-1 votes

这不是确切的答案,但是这对于希望通过在mysql中按组先排序的方法解决某些问题的人们可能有所帮助。

当我想查找最新的行时(我是GROUP_CONCAT(string SEPARATOR ' ') as new_column,但对于特定的列类型,它只有一个结果,即GROUP_CONCAT(string SEPARATOR ' ') as new_column),我来到了这个线程。

解决此问题的另一种方法是利用聚合。

因此,我们可以让查询照常运行,对asc进行排序,并引入新字段GROUP_CONCAT(string SEPARATOR ' ') as new_column,该字段将提供最新日期,并按同一列分组。

假设您现在想查找特定列的数据,并且无法进行最大聚合。通常,要查找特定列的数据,可以使用GROUP_CONCAT(string SEPARATOR ' ') as new_column,该列中没有一些唯一的分隔符,例如GROUP_CONCAT(string SEPARATOR ' ') as new_column,并且在访问它时,可以拆分/分解该列。 new_column字段。

再次,这可能并不对每个人都听起来。 我做到了,也很喜欢它,因为我编写的函数很少,而且我无法运行子查询。 我正在为PHP编写codeigniter框架。

也不确定其复杂性,也许有人可以对此有所了解。

问候 :)

Satys answered 2019-12-28T06:47:21Z

mysql按年月排序group by升序_排序-在MySQL中按GROUP BY名称之前的日期和时间排序相关推荐

  1. java国际化——日期和时间+排序

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化--日期和时间+排序 的基础知识 : [1]日期和时间 1)当格 ...

  2. mysql 中文排序是什么规则_什么是 MySQL 的排序规则(Collation)?

    什么是 MySQL 的排序规则(Collation)? 马富天 2020-01-19 14:56:58 15 [摘要]当我们在使用 navicate for mysql 等第三方客户端管理界面新建一个 ...

  3. mysql查询 多门课程的平均成绩_数据分析中级 MySQL 任务6 总结复习

    0 入门 0.1 MySQL安装,Navicat安装: 0.2 MySQL设置,Nacicat设置,包括链接点,unicode-8: 0.3 创建表格,student, course, score, ...

  4. mysql单列索引和多列索引_浅谈MySQL索引优化

    索引基础知识总结及常见索引优化手段 一.索引简介 什么是索引? MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 可以简单理解为"排好序的快速查找数据 ...

  5. mysql 5.7和8.0区别_前沿观察 | MySQL性能基准测试对比:5.7 VS 8.0

    点小蓝字加关注! 版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于severalnines英文官网,若转载请注明出处.翻译目的在于传递更多全球最新数据库领域相关信息,并不意味着腾讯云数据库 ...

  6. mysql 查询姓张或者姓王_题目:MySql数据查询题目(学生和课程成绩)

    1)     创建student和score表 2)     为student表和score表增加记录 3)     查询student表的所有记录 SELECT * from student 4)  ...

  7. mysql batch insert 遇到错误跳过_这是MySQL的bug吗?

    前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考.在此,建议大家为本公众号加"星标".如文章写得好,望大家阅读后在右下边"在看"处点个赞,以示鼓励! ...

  8. mysql锁机制为何设计如此复杂_再谈mysql锁机制及原理—锁的诠释

    加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...

  9. java 排序算法面试题_面试题: java中常见的排序算法的实现及比较

    1.冒泡排序 1.1 冒泡排序普通版 每次冒泡过程都是从数列的第一个元素开始,然后依次和剩余的元素进行比较,若小于相邻元素,则交换两者位置,同时将较大元素作为下一个比较的基准元素,继续将该元素与其相邻 ...

最新文章

  1. 开启一个新的spyder窗口
  2. 函数式编程语言python-函数式编程
  3. 1. 定义方法,求出指定元素在数组中出现的次数.
  4. nfs搭建和可能的问题
  5. 带有MySQL和Bootstrap的Django 3教程和CRUD示例
  6. Swift来了,是不是能够入手IOS开发了?
  7. es java bulk 导入数据一直超时_亿级别记录的mongodb批量导入ElasticSearch的java代码完整实现...
  8. 理解频域、时域、FFT和加窗 加深对信号的认识
  9. 概念模型向逻辑模型的转换规则
  10. linux一台服务器上装两个mysql数据库
  11. 关于assert im_orig.shape[2] == 3, 3ch image is expected
  12. 理想汽车的2021,是否“理想”?
  13. VMware安装win7后,安装VMware Tools时报错安装程序无法继续
  14. VMware 14 Pro 永久许可证激活密钥
  15. legacy服务器安装系统,支持UEFI和LEGACY的多系统安装U盘
  16. MySQL基础知识,如果有疏漏、错误的地方请大家指出
  17. cocos2dx3.0戳青蛙游戏(打地鼠)
  18. ct伪影消除matlab代码,CT去伪影总结
  19. Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务
  20. 2019/7/2 图书馆检索·真·简陋版(新人学习向)

热门文章

  1. win10安装无线显示器失败
  2. 封装篇——图片模块(Glide)
  3. 快速找到你的另一半——相亲小程序
  4. ShardingSphere分库分表核心原理精讲第十二节 数据安全和脱敏详解
  5. 程序员应该访问的最佳网站
  6. 计算机网络协议分为哪几层?7层协议、5层协议、4层协议。
  7. Mysql 查询数据库中哪个表的字段个数最多
  8. Qt中对字符串长度转换成像素长度
  9. 不讲武德(手动狗头):面试官上来就甩给我几道多线程代码题叫我手撕,我心里拔凉拔凉的~~~
  10. 怎样在ZBrush中快速绘制人体躯干