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

排序-在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值