使用ORDER BY和GROUP BY一起

问题描述:

我的表看起来像这样(我使用MySQL):使用ORDER BY和GROUP BY一起

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 

我认为它会导致因为它第一次做GROUP_BY,然后对结果进行排序。

任何想法?谢谢。要做到这一点

+2

使用'MAX'从您的组 – Nanne 2012-04-05 14:45:20

+6

一个'GROUP BY'条款没有聚合函数选择最大(如:'COUNT(),SUM(),MAX()')没有任何意义可言。它让我感到困惑,MySQL甚至允许这样做。想想看,如果你对这些团体没有做任何事情,你为什么要分组? – NullUserException 2012-04-05 14:47:48

+0

如果m_id有两个不同的v_id,该怎么办?期望的结果是什么? – 2012-04-05 14:49:56

一种方式,正确地使用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 

如何工作的:

  • 选择在子查询
  • 仅从table选择行每个不同m_id最新时间戳与子查询中的一行匹配(此操作 - 执行连接的地方,但没有从第二个表中选择列,它仅用作过滤器) - 知道n,作为情况下"semijoin"你是好奇)
  • 号令行
+0

非常感谢你的工作。你能解释我这是'r'吗?这是一个临时表?它如何在SQL中调用? – Luis 2012-04-05 15:22:14

+1

@luis - 想象一下,子查询是一个视图;一个在线视图。它需要一个名称,所以你可以引用它,它是字段。这个答案提供了在线视图名称“r”。你几乎可以称它为任何你喜欢的东西。 – MatBailie 2012-04-05 15:31:42

+2

@Luis它是你可以引用子查询的别名。我也可以把'(select ...)写成r'(注意as)来使它更清楚。 – 2012-04-05 15:33:51

如果你真的不关心哪些时间戳你会得到你的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变化对于一个给定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 

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; 

你可以试试这个

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

不是个好主意。您正在选择没有限制的所有行 – AliN11 2017-11-25 07:41:26

只要你需要ASC来说明。写下面的查询。它将按照升序返回值。 SELECT * FROM表GROUP BY m_id ORDER BY m_id asc;

+0

这不起作用。虽然它会扭转结果,但它仍然不会返回所需的结果。 – Richlv 2017-08-03 20:32:20

您需要将DESC替换为ASC。像这样写查询,它将按照升序返回值。

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