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之前!
答案 0 :(得分:71)
另一种方法:
SELECT *
FROM (
SELECT *
ORDER BY date ASC, time ASC
) AS sub
GROUP BY name
GROUP BY组匹配的第一个匹配结果。如果第一次匹配命中恰好是你想要的那个,那么一切都应该按预期工作。
我更喜欢这种方法,因为子查询具有逻辑意义,而不是在其他条件下使用它。
答案 1 :(得分:25)
我认为这就是你所寻求的:
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'))
答案 2 :(得分:22)
由于我不允许对user1908688的回答发表评论,这里有一个对MariaDB用户的提示:
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/
答案 3 :(得分:8)
这对我有用:
SELECT *
FROM your_table
WHERE id IN (
SELECT MAX(id)
FROM your_table
GROUP BY name
);
答案 4 :(得分:3)
使用子选择:
select name, date, time
from mytable main
where date + time = (select min(date + time) from mytable where name = main.mytable)
order by date + time;
答案 5 :(得分:0)
我在这个问题上有不同的变体,我只有一个scriptler script
字段,在DATETIME
或limit
之后需要group by
排序后根据distinct
字段,但这对我有所帮助:
datetime
在这个带有分割字段的实例中,如果你可以对concat进行排序,那么你可能会得到类似的东西:
select distinct (column) from
(select column from database.table
order by date_column DESC) as hist limit 10
然后,如果你想限制,你只需将限制语句添加到结尾:
select name,date,time from
(select name from table order by concat(date,' ',time) ASC)
as sorted
答案 6 :(得分:0)
解决此问题的另一种方法是使用LEFT JOIN
,它可能更有效。我首先从一个仅考虑日期字段的示例开始,因为将日期和时间存储在一个datetime列中可能更常见,并且我还想保持查询简单,以便于理解。
因此,在这个特定示例中,如果您要基于 date 列显示最旧的记录,并假设您的表名名为{{1} },您可以使用以下查询:
people
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
列为最小值时,在左侧联接上将没有{较小的p.date
,因此相应的{{ 1}}将是p2.date
。因此,通过添加p2.date
,我们确保仅显示日期最早的记录。
同样,如果要显示最新记录,则只需在NULL
中更改比较运算符即可:
WHERE p2.date is NULL
现在,对于这个特定的示例,其中date + time是单独的列,如果要基于合并的两列的datetime进行查询,则需要以某种方式添加它们,例如:
LEFT JOIN
您可以在The Rows Holding the Group-wise Maximum of a Certain Column页面上了解有关此内容的更多信息(以及其他实现此目的的方法)。
答案 7 :(得分:0)
在Oracle中,这对我有用
SELECT name, min(date), min(time)
FROM table_name
GROUP BY name
答案 8 :(得分:0)
为我工作mysql 选择*从(SELECT number,max(date_added)作为datea FROM sms_chat按数字分组)作为按日期排序的datea desc
答案 9 :(得分:-1)
这不是确切的答案,但这对于那些希望通过在mysql中按组排序排序方法来解决某些问题的人来说可能会有所帮助。
当我想找到最新的一行( group by column name
但是获得特定列类型的唯一结果时,我来到了这个帖子,这是 { {1}} 强>)。
解决此类问题的另一种方法是使用聚合。
因此,我们可以像往常一样运行查询,排序asc ,并将新字段引入 max(doc) as latest_doc
,这将提供最新日期,按同一列分组。
假设您要立即查找特定列的数据,并且无法执行 max aggregation 。
通常,要查找特定列的数据,您可以使用 GROUP_CONCAT aggregator
,并使用一些唯一的分隔符,该分隔符不能出现在该列中,例如 {{ 1}} ,当您访问它时,您可以拆分/分解new_column字段。
同样,这可能听起来不是每个人。我做了它,并且喜欢它,因为我写了很少的函数,我无法运行子查询。我正在研究php的codeigniter框架。
也不确定复杂程度,可能有人可以对此有所了解。
问候:)