MySQLはGROUP BY命令を選択します

私はmysql文を持っています

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

正しい結果が得られていますが、正しい順序ではありません。

グループ化はうまくいきますが、グループに表示されているレコードは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のメッセージです。

乾杯

8
2つの列(IDや最新のタイムスタンプなど)だけが必要な場合は、次のように動作します: stackoverflow.com/a/4448536/722036 。何百万行もの巨大なテーブルでサブクエリを使用するよりも高速です。
追加された 著者 The Sexiest Man in Jamaica,
表示するクエリは何ですか?
追加された 著者 ypercubeᵀᴹ,

4 答え

これは動作するかもしれませんが(保証されません):

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
9
追加された
これは機能しているようです。若干の変更が必要です(GROUP BYの前にtbl_messagesを追加します)。ありがとう!
追加された 著者 puks1978,
ありがとう、学校ではサブクラスについてもっと学んだ...私はこの偉大なクエストを覚えていなかった...先生...古い記憶
追加された 著者 delive,

ORDER BYの後にGROUP BYを実行します。これは次のようにGROUP BYを使用してクエリをラップします。

SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from
8
追加された
たとえASCをクエリ "t"に入れてDESCを取っても。
追加された 著者 Mohammed Abrar Ahmed,

あなたのメッセージテーブルが自動インクリメントのプライマリキーを持っていて、すべてのメッセージが本質的に最も高い数字が最新の日付です...しかし、私はそれを知らないので、私はMAX(date_sent) max(SomeIDKey)ではなく、原則は同じです。

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
2
追加された
@MohammedAbrarAhmed、内部MaxPerUserクエリに適用される順序はありません。ただし、最新のメッセージ日付に基づいて外側の結果が必要な場合は、ORDER BY MaxPerUser.LatestMsgDateを使用します。最新のメッセージが上部に浮動していると思われる場合はそれを選択します。
追加された 著者 DRapp,
クエリの最後に、どのようにORDER BYをMaxPerUserとGROUP BYに追加しますか?
追加された 著者 Mohammed Abrar Ahmed,

このような意味ですか?

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

1
追加された