2012-04-05 84 views
24

我的表看起來像這樣(我使用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

回答

31

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

5

如果你真的不關心哪些時間戳你會得到你的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 
2

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; 
3

你可以試試這個

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

1

只要你需要ASC來說明。寫下面的查詢。它將按照升序返回值。 SELECT * FROM表GROUP BY m_id ORDER BY m_id asc;

+0

這不起作用。雖然它會扭轉結果,但它仍然不會返回所需的結果。 – Richlv 2017-08-03 20:32:20

0

您需要將DESC替換爲ASC。像這樣寫查詢,它將按照升序返回值。

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