2010-11-07 213 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