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 descgroup 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