一起使用ORDER BY和GROUP BY

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)

我认为这是因为它首先执行GR​​OUP_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匹配来自子查询的行的行(此操作 - 执行连接,但是没有从第二个表中选择列,它只是用作过滤器 - 如果你被称为"半连接",则称为"半连接"很好奇)
  • 命令行

  • @luis - 假设子查询是一个视图;内嵌视图。它需要一个名称,以便您可以引用它及其字段。此答案为内嵌视图命名为“r”。你几乎可以称之为任何你喜欢的东西。 (2认同)
  • @Luis它是一个别名,您可以通过它来引用子查询.我也可以将`(select ...)写为r`(注意as)以使其更清晰. (2认同)

Mos*_*cho 8

如果你真的不关心你会得到哪个时间戳,并且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 的最大时间戳。


Ron*_*tel 5

你可以试试这个

 SELECT tbl.* FROM (SELECT * FROM table ORDER BY timestamp DESC) as tbl
 GROUP BY tbl.m_id  
Run Code Online (Sandbox Code Playgroud)

  • 不好主意。您正在无限制地选择所有行 (2认同)