一起使用ORDER BY和GROUP BY

时间:2012-04-05 14:43:58

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

我的目标是每次使用m_id,并按最高时间戳排序。

结果应为:

m_id | v_id | timestamp
------------------------
6    |   1  | 1333635343
34   |   1  | 1333635336

我写了这个问题:

SELECT * FROM table GROUP BY m_id ORDER BY timestamp DESC

但结果是:

m_id | v_id | timestamp
------------------------
34   |   1  | 1333635323
6    |   1  | 1333635317

我认为这是因为它首先执行GR​​OUP_BY然后对结果进行ORDER。

有什么想法吗?谢谢。

7 个答案:

答案 0 :(得分:44)

正确使用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

这是如何运作的:

  • 为子查询
  • 中的每个不同m_id选择最新时间戳
  • 仅选择table中与子查询中的行匹配的行(此操作 - 执行连接但未从第二个表中选择任何列,它仅用作过滤器 - 已知作为"semijoin"如果你好奇的话)
  • 订购行

答案 1 :(得分:7)

如果你真的不关心你会得到哪个时间戳,并且v_id对于给定的m_i总是相同的,你可以执行以下操作:

select m_id, v_id, max(timestamp) from table
group by m_id, v_id
order by timestamp desc

现在,如果给定v_id的{​​{1}}发生了更改,那么您应该执行以下操作

m_id

答案 2 :(得分:6)

你可以试试这个

 SELECT tbl.* FROM (SELECT * FROM table ORDER BY timestamp DESC) as tbl
 GROUP BY tbl.m_id  

答案 3 :(得分:4)

SQL>

SELECT interview.qtrcode QTR, interview.companyname "Company Name", interview.division Division 
FROM interview 
JOIN jobsdev.employer 
    ON (interview.companyname = employer.companyname AND employer.zipcode like '100%')
GROUP BY interview.qtrcode, interview.companyname, interview.division
ORDER BY interview.qtrcode;

答案 4 :(得分:2)

这是最简单的解决方案

select m_id,v_id,max(timestamp) from table group by m_id;

按m_id分组,但每个m_id获取最大时间戳。

答案 5 :(得分:1)

只需要用asc来描述。写下面的查询。它将按升序返回值。

SELECT * FROM table GROUP BY m_id ORDER BY m_id asc;

答案 6 :(得分:-1)

为什么要这么复杂?这行得通。

SELECT m_id,v_id,MAX(TIMESTAMP) AS TIME
 FROM table_name 
 GROUP BY m_id