Lui*_*uis 40 mysql sql group-by greatest-n-per-group
我的表看起来像这样(我正在使用MySQL):
m_id | v_id | timestamp
------------------------
6 | 1 | 1333635317
34 | 1 | 1333635323
34 | 1 | 1333635336
6 | 1 | 1333635343
6 | 1 | 1333635349
Run Code Online (Sandbox Code Playgroud)
我的目标是每次m_id,并按最高时间戳排序.
结果应该是:
m_id | v_id | timestamp
------------------------
6 | 1 | 1333635343
34 | 1 | 1333635336
Run Code Online (Sandbox Code Playgroud)
我写了这个查询:
SELECT * FROM table GROUP BY m_id ORDER BY timestamp DESC
Run Code Online (Sandbox Code Playgroud)
但是,结果是:
m_id | v_id | timestamp
------------------------
34 | 1 | 1333635323
6 | 1 | 1333635317
Run Code Online (Sandbox Code Playgroud)
我认为这是因为它首先执行GROUP_BY然后对结果进行ORDER.
有任何想法吗?谢谢.
Mat*_*ick 46
一种正确使用的方法group by
:
select l.*
from table l
inner join (
select
m_id, max(timestamp) as latest
from table
group by m_id
) r
on l.timestamp = r.latest and l.m_id = r.m_id
order by timestamp desc
Run Code Online (Sandbox Code Playgroud)
这是如何工作的:
m_id
子查询中每个不同的最新时间戳table
匹配来自子查询的行的行(此操作 - 执行连接,但是没有从第二个表中选择列,它只是用作过滤器 - 如果你被称为"半连接",则称为"半连接"很好奇)如果你真的不关心你会得到哪个时间戳,并且v_id
对于给定的时间总是相同的,m_i
你可以执行以下操作:
select m_id, v_id, max(timestamp) from table
group by m_id, v_id
order by timestamp desc
Run Code Online (Sandbox Code Playgroud)
现在,如果v_id
给定的更改,m_id
那么您应该执行以下操作
select t1.* from table t1
left join table t2 on t1.m_id = t2.m_id and t1.timestamp < t2.timestamp
where t2.timestamp is null
order by t1.timestamp desc
Run Code Online (Sandbox Code Playgroud)
小智 7
这是最简单的解决方案
select m_id,v_id,max(timestamp) from table group by m_id;
Run Code Online (Sandbox Code Playgroud)
按 m_id 分组,但获取每个 m_id 的最大时间戳。
你可以试试这个
SELECT tbl.* FROM (SELECT * FROM table ORDER BY timestamp DESC) as tbl
GROUP BY tbl.m_id
Run Code Online (Sandbox Code Playgroud)