我的表看起来像这样(我正在使用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
我认为这是因为它首先执行GROUP_BY然后对结果进行ORDER。
有什么想法吗?谢谢。
答案 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