ORDER BY日期和时间BEFORE在mysql中的GROUP BY名称

Cod*_*ife 54 mysql sorting group-by sql-order-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
Run Code Online (Sandbox Code Playgroud)

我想要最早的名字:

SELECT * 
ORDER BY date ASC, time ASC 
GROUP BY name
Run Code Online (Sandbox Code Playgroud)

( - >不起作用!)

现在它应该先让我疯狂(早期约会)然后汤姆

但是GROUP BY name ORDER BY date ASC, time ASC先给我一个新的疯狂,因为它在它排序之前就已经分组了!

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

小智 75

另一种方法:

SELECT * 
FROM (
    SELECT * 
    ORDER BY date ASC, time ASC 
) AS sub
GROUP BY name
Run Code Online (Sandbox Code Playgroud)

它击中第一个匹配结果的GROUP BY组.如果第一次匹配命中恰好是您想要的那个,那么一切都应该按预期工作.

我更喜欢这种方法,因为子查询具有逻辑意义,而不是将其与其他条件混淆.

  • 请注意,遗憾的是,这种方法不适用于MariaDB(尽管MariaDB被认为是MySQL的直接替代品):https://mariadb.com/kb/en/mariadb/why-is-order-by-in-a-从-子查询,忽略/ (13认同)
  • 在子查询中添加"LIMIT 18446744073709551615"应该可以解决MariaDB上的问题,但这是一个肮脏的解决方案:) (8认同)
  • 子查询中似乎缺少FROM. (5认同)
  • 它不是我的数据库.我正在使用mysql 5.7.17 (4认同)
  • 如果子查询返回一个大数据集,这对于大数据集来说会变得非常慢。 (2认同)

Cyr*_*don 27

我想这就是你要求的:

SELECT name, min(date)
FROM myTable
GROUP BY name
ORDER BY min(date)
Run Code Online (Sandbox Code Playgroud)

当时,您必须通过STR_TO_DATE创建一个mysql日期:

STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s')
Run Code Online (Sandbox Code Playgroud)

所以:

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'))
Run Code Online (Sandbox Code Playgroud)

  • 我认为这不起作用.无法保证返回的名称列与日期位于同一行.如果这似乎已经解决了您的问题,请注意它很可能不稳定. (10认同)

小智 25

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

SELECT *
FROM (
     SELECT *
     ORDER BY date ASC, time ASC
     LIMIT 18446744073709551615
     ) AS sub
GROUP BY sub.name
Run Code Online (Sandbox Code Playgroud)

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

  • 我对这有多hacky感到畏缩,但它似乎是让它在MariaDB上工作的唯一方法...... (3认同)

小智 11

这对我有用:

SELECT *
FROM your_table
WHERE id IN (
    SELECT MAX(id)
    FROM your_table
    GROUP BY name
);
Run Code Online (Sandbox Code Playgroud)