2011-12-19 5 views
8

、GROUP BYを選択しかし、彼らは正しい順序ではありません。

グルーピングはうまくいきますが、グループに表示されているレコードは最初にDBに記録されて記録されますが、最新のレコードを各グループに表示することをお勧めします。

グループごとに最新のレコードを表示する方法はありますか?

2011-12-19 12:16:25 This is the first message 
2011-12-19 12:18:20 This is the second message 
2011-12-19 12:43:04 This is the third message 

グループは、私はそれが最新の記録/メッセージであるとして、「これは、第3のメッセージは」希望「これは最初のメッセージである」を示しています。

乾杯

+0

表示するクエリは何ですか? –

+0

IDとその最新のタイムスタンプなど2つの列のみが必要な場合は、次のように動作します:http://stackoverflow.com/a/4448536/722036数百万行の巨大なテーブルでサブクエリを使用するよりも**高速です**。 –

答えて

9

これは動作します(ただし保証されません)があります。

SELECT * 
FROM 
    (SELECT * 
    FROM tbl_messages 
    WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
    ORDER BY date_sent DESC 
) tmp 
GROUP BY from_user_id 
ORDER BY date_sent DESC 

これは動作するはずです:

SELECT t.* 
FROM 
    tbl_messages AS t 
    JOIN 
    (SELECT from_user_id 
      , MAX(date_sent) AS max_date_sent 
     FROM tbl_messages 
     WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
     GROUP BY from_user_id 
    ) AS tg 
    ON (tg.from_user_id, tg.max_date_sent) = (t.from_user_id, t.date_sent) 
ORDER BY t.date_sent DESC 
+0

これは動作しているようです。若干の変更が必要です(GROUP BYの前にtbl_messagesを追加します)。ありがとう! – puks1978

+0

学校で、私の日を節約しました。私はサブクエリについてもっと学んだ...私はこの偉大なクエストを覚えていませんでした...先生...古い記憶 – delive

-1

は、あなたがこのような何かを意味してください:あなたのメッセージテーブルが自動インクリメントされる主キーを持っており、すべてのメッセージが自然である場合

 
SELECT * FROM tbl_messages WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' GROUP BY from_user_id ORDER BY from_user_id, date_sent DESC 

2

を最高の数は、最新の日付です...しかし、私はそれを知っていないので、max(SomeIDKey)ではなくMAX(date_sent)に基づいていますが、原則は同じです。

select 
     tm2.* 
    from 
     (select tm1.from_user_id, 
       max(tm1.date_sent) LatestMsgDate 
      from tbl_messages tm1 
      group by tm1.from_user_id) MaxPerUser 

     left join tbl_messages tm2 
     on MaxPerUser.From_User_ID = tm2.From_User_ID 
     AND MaxPerUser.LatestMsgDat = tm2.Date_Sent 

    order by 
     date_sent DESC 
+0

クエリの最後に、どのようにORDER BYをMaxPerUserとGROUP BYに追加しますか? –

+1

@MohammedAbrarAhmed、内側のMaxPerUserクエリに適用可能な順序はありません。ただし、最新のメッセージ日付に基づいて外側の結果が必要な場合は、ORDER BY MaxPerUser.LatestMsgDateを使用します。最新のメッセージが上部に浮動していると思われる場合はそれを選択します。 – DRapp

8

はでクエリをラップすることにより、ORDER BYの後にGROUP BYを実行します。 GROUP BYは次のようになります。

SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from 
+0

私はクエリに "t" –

関連する問題

 関連する問題