2010-11-07 210 views
3

可能重複:
SQL ORDER BY total within GROUP BYGROUP BY和ORDER BY

SELECT * 
FROM users_pm_in 
WHERE uID = '1' 
GROUP BY dialog_id 
ORDER BY date DESC 

不會工作正常。我想要做的組dialog_id。然後所有按日期排序dialog_id它們,然後按日期對所有對它們進行排序..

所以:

id | uID | bID | msg  | dialog_id | date 
-------------------------------------------------- 
1 | 1 | 2 | Hello | 1   | 1289158631 
2 | 2 | 1 | Hi?  | 1   | 1289158691 
3 | 1 | 2 | Wazzaa? | 1   | 1289158931 

兩個entry's dialog_id的值爲1(使用GROUP BY)。好。然後它應該由具有最新日期的兩個信息組(在組內)中的一個(按日期排序desc)排序。這種情況是與日期1289158931。

這是怎麼做到的?

UPDATE:

我想出來什麼:

while($row = mysql_fetch_array($query)){ 
    echo $row["msg"] // it should echo "Wazzaa?" 
    echo $row["id"] // it should give me id 3 
} 

它給我的最後每個dialog_id,這就是爲什麼我想在分組

+0

你的日期是1289158931? – pavanred 2010-11-07 20:43:52

+0

unix時間戳是 – Johnson 2010-11-07 20:44:52

+0

請根據樣本數據提供您的預期輸出。 – 2010-11-07 20:47:00

回答

4

用途:

SELECT a.id, 
     a.msg 
    FROM USERS_PM a 
    WHERE a.dialog_id = 1 
    AND 1 IN (a.uid, a.bid) 
ORDER BY a.date DESC 
    LIMIT 1 

...或:

SELECT a.id, 
     a.msg 
    FROM USERS_PM a 
    JOIN (SELECT t.dialog_id, 
       MAX(t.date) AS max_date 
      FROM USERS_PM t 
     GROUP BY t.dialog_id) b ON b.dialog_id = a.dialog_id 
          AND b.max_date = a.date 
WHERE a.dialog_id = 1 
    AND 1 IN (a.uid, a.bid) 
+0

+'ORDER BY a.date DESC'在最後。 – 2010-11-07 20:59:12

+0

爲什麼WHERE dialog_id =?我不應該指定一個dialog_id? – Johnson 2010-11-07 20:59:12

+0

@Johnson:如果你忽略了WHERE子句,你會得到每個dialog_id值的最新帖子。 – 2010-11-07 21:00:25