mysql中按名称分组之前的日期和时间排序

mysql中按名称分组之前的日期和时间排序,mysql,sorting,group-by,sql-order-by,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 (>不起作用!) 现在它应该给我的第一个疯狂(有更早的日期),然后汤

我有一张这样的桌子:

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
(>不起作用!)

现在它应该给我的第一个疯狂(有更早的日期),然后汤姆

但是对于
按名称分组按日期排序的ASC,时间ASC
首先给我一个较新的mad,因为它在排序之前先分组

再次:问题是我不能在分组之前按日期和时间排序,因为分组依据必须在订单依据之前

使用子选择:

select name, date, time
from mytable main
where date + time = (select min(date + time) from mytable where name = main.mytable)
order by date + time;

我想这就是你想要的:

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 * 
FROM (
    SELECT * FROM table_name
    ORDER BY date ASC, time ASC 
) AS sub
GROUP BY name
在第一个匹配结果中按组分组。如果第一次匹配的命中恰好是你想要的,那么一切都应该按预期进行


我更喜欢这种方法,因为子查询具有逻辑意义,而不是附加其他条件。

因为我不允许对user1908688的答案发表评论,这里给MariaDB用户一个提示:

SELECT *
FROM (
     SELECT *
     ORDER BY date ASC, time ASC
     LIMIT 18446744073709551615
     ) AS sub
GROUP BY sub.name
这对我很有效:

SELECT *
FROM your_table
WHERE id IN (
    SELECT MAX(id)
    FROM your_table
    GROUP BY name
);

在这个问题上,我有一个不同的变体,我只有一个
DATETIME
字段,在
groupby
distinct
之后需要一个
limit
,根据
DATETIME
字段进行降序排序,但这对我有帮助:

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

这不是确切的答案,但这可能有助于人们解决mysql中在分组之前排序行的方法的一些问题

当我想要查找最新的行时,我来到了这个线程(这是
按日期排序的desc
,但对于特定的列类型,只得到一个结果,即
按列名分组

解决此问题的另一种方法是使用聚合。

因此,我们可以让查询像往常一样运行,对asc进行排序,并引入新字段作为
max(doc)作为latest\u doc
,它将给出最新的日期,并按同一列进行分组

假设您现在要查找特定列的数据,但无法执行max aggregation。 一般来说,要查找特定列的数据,您可以使用
GROUP\u CONCAT聚合器
,使用该列中不存在的某些唯一分隔符,如
GROUP\u CONCAT(字符串分隔符“”)作为新的\u列
,并且在访问它时,可以拆分/分解新的_列字段

再说一次,这可能不是每个人都能理解的。我做到了,而且也很喜欢,因为我写的函数很少,无法运行子查询。我正在为php开发codeigniter框架

也不确定其复杂性,也许有人可以解释一下


注意:)

解决此问题的另一种方法是使用
左连接,这可能更有效。首先,我将从一个只考虑日期字段的示例开始,因为在一个datetime列中存储日期+时间可能更常见,而且我还希望保持查询的简单性,以便更容易理解

因此,在这个特定的示例中,如果您希望基于日期列显示最早的记录,并假设您的表名为
人员
,则可以使用以下查询:

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
列处于其最小值时,将不会有
p2.date
在LEFT JOIN上具有较小的值,因此相应的
p2.date
将为
NULL
。因此,通过添加
,其中p2.date为NULL
,我们确保只显示日期最早的记录

同样,如果要显示最新的记录,只需更改
左连接中的比较运算符即可:

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

您可以在页面上阅读更多关于这方面的信息(还可以看到其他一些实现方法)。

在Oracle中,这是我的工作

SELECT name, min(date), min(time)
    FROM table_name
GROUP BY name
为我工作
选择*from(选择号码,最大(添加日期)作为datea从sms_聊天组按号码)作为sup order by datea desc

group by与聚合函数一起使用,而不是用于排序-您确定这一点正确吗?您有更好的主意吗?我想到了distinct,但是日期和时间也是distinct。如果有某种方式来组合日期和时间列,那么您实际上想要的是每个名称的名称和最早的datetime值吗?结果应该是:mad | 2009-06-03 | 00:01:01/\tom | 2011-07-04 | 01:09:52您的选择没有聚合函数,因此“分组依据”什么都不做。天蝎座的答案应该有用…我不知道这是否真的是我问题的答案。它似乎不符合时间的顺序。请检查这里的语法是否正确:($sql='SELECT*FROM table GROUP BY name')$sql.=“ORDER BY min(STR_TO_DATE(orderDate+''+orderTime,'%m/%d/%Y%h:%i:%s'))”;如果正在分组,则无法执行“选择*”。更改查询的SELECT部分。好的,我现在怎么说$row[“date”]?它排序不正确。。。它只是表示日期为NULL,并且订单未排序。我犯了一个错误,您需要的不是%m/%d/%Y,而是%Y-%m-%d。我更新了查询。我认为这不起作用。无法保证返回的名称列与日期来自同一行。如果这似乎解决了您的问题,请注意它很可能不稳定。请注意,不幸的是,这种方法在MariaDB上不起作用(尽管MariaDB被认为是MySQL的替代品):子查询中似乎缺少一个FROM。如果子查询返回一个b,那么对于大型数据集来说,这将变得非常缓慢
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
SELECT name, min(date), min(time)
    FROM table_name
GROUP BY name