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组.如果第一次匹配命中恰好是您想要的那个,那么一切都应该按预期工作.
我更喜欢这种方法,因为子查询具有逻辑意义,而不是将其与其他条件混淆.
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)
小智 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/
小智 11
这对我有用:
SELECT *
FROM your_table
WHERE id IN (
SELECT MAX(id)
FROM your_table
GROUP BY name
);
Run Code Online (Sandbox Code Playgroud)