按组和排序

3
可能重复:
SQL ORDER BY total within GROUP BY
(这是关于)在GROUP BY中按总计排序的SQL问题。
SELECT *
FROM users_pm_in
WHERE uID = '1'
GROUP BY dialog_id
ORDER BY date DESC

无法正常工作。我想做的是按对话 ID 分组。然后,将所有带有相同对话 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

对话框ID的两个条目(通过GROUP BY)都得到了1。好的。然后应该按照其中一个条目(在组内)的最新日期进行排序(按日期降序排列)。在这种情况下,具有日期1289158931的是其中一个。
如何做到这一点?
更新:
我想要的结果是:
while($row = mysql_fetch_array($query)){
    echo $row["msg"] // it should echo "Wazzaa?"
    echo $row["id"] // it should give me id 3
}

它为每个对话 ID 提供了最后一个,这就是我想要它分组的原因。


你的日期是1289158931? - pavanred
请根据样本数据提供您的预期输出。 - OMG Ponies
如果我理解正确,他也想按日期对他的“组”进行排序。对吗? - trix
1个回答

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)

在最后加上 ORDER BY a.date DESC - dev-null-dweller
为什么我不应该指定dialog_id,WHERE dialog_id =? - Johnson
@Johnson:如果你省略了WHERE子句,你将会得到每个dialog_id值的最新帖子。 - OMG Ponies
@OMG Ponies现在开始工作了,但是我应该把我的WHERE uID ='$USER'放在哪里,就像我在第一个查询中一样? - Johnson
固定,添加GROUP BY t.dialog,t.uID。 - Johnson
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接