2011-11-07 260 views
2

我已閱讀訂閱前發生的分組,有沒有什麼辦法可以在分組之前先進行排序,而無需將整個查詢包裹在另一個查詢中,只需執行此操作?在使用GROUP BY之前對數據進行排序?

比方說,我有這樣的數據:

id | user_id | date_recorded 
1 | 1  | 2011-11-07 
2 | 1  | 2011-11-05  
3 | 1  | 2011-11-06 
4 | 2  | 2011-11-03 
5 | 2  | 2011-11-06 

通常情況下,我必須做的,以這個查詢得到我想要的:

SELECT 
* 
FROM (
    SELECT * FROM table ORDER BY date_recorded DESC 
) t1 
GROUP BY t1.user_id 

但我不知道是否有更好的解決方案。

+0

它是什麼你想達到什麼目的?你沒有集合函數('SUM(),AVG(),COUNT()'...),因此不需要'GROUP BY' –

+0

如果你試圖按照日期排序,那麼通過user_id用戶「分組」在一起,這只是一個2部分「ORDER BY」操作。 –

+0

只需將您的問題更改爲「在開始排序之前對數據進行排序」,以便它可以針對需要和有用 –

回答

1

你的問題是有點不清楚,但我懷疑你真正想要的是不屬於任何GROUP聚集可言,但按日期而排序第一,然後用戶ID:

SELECT 
    id, 
    user_id, 
    date_recorded 
FROM tbl 
ORDER BY date_recorded DESC, user_id ASC 

這裏會是這個結果。注意通過date_recorded重新排序從原來的例子

id | user_id | date_recorded 
1 | 1  | 2011-11-07 
3 | 1  | 2011-11-06 
2 | 1  | 2011-11-05  
5 | 2  | 2011-11-06 
4 | 2  | 2011-11-03 

更新

要檢索每USER_ID的最新記錄,需要一個JOIN。子查詢(mx)查找每個user_id的最新date_recorded,並將該結果連接到完整表以檢索其餘列。

SELECT 
    mx.user_id, 
    mx.maxdate, 
    t.id 
FROM (
    SELECT 
    user_id, 
    MAX(date_recorded) AS maxdate 
    FROM tbl 
    GROUP BY user_id 
) mx JOIN tbl t ON mx.user_id = t.user_id AND mx.date_recorded = t.date_recorded 
+0

假設我只想爲每個用戶標識獲取單個最新記錄。 – voldomazta

+0

@voldomazta爲了獲得完整的最新記錄,需要一個連接的子查詢。見上面我的補充。 –

0

蔭剛使用該技術

「組之前使用順序條款在GROUP_CONCAT條款將其插入」

SELECT SUBSTRING_INDEX(group_concat(cast(id as char) 
            ORDER BY date_recorded desc),',',1), 
     user_id, 
     SUBSTRING_INDEX(group_concat(cast(`date_recorded` as char) 
            ORDER BY `date_recorded` desc),',',1) 
FROM data 
GROUP BY user_id 
相關問題