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

时间:2011-07-04 13:21:57

标签: 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

我首先想要最早的名字:

SELECT * 
ORDER BY date ASC, time ASC 
GROUP BY name

( - >不起作用!)

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

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

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

10 个答案:

答案 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字段,在DATETIMElimit之后需要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框架。

也不确定复杂程度,可能有人可以对此有所了解。

问候:)