web-dev-qa-db-ja.com

MySQLはGROUPBYの順序を選択します

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番目のメッセージです」という最新のレコード/メッセージです。

乾杯

9
puks1978

これは機能する可能性があります(ただし、保証はされません)。

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
ypercubeᵀᴹ

次のようにクエリをGROUPBYでラップして、ORDERBYの後にGROUPBYを実行します。

SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from
8
11101101b

メッセージテーブルに自動インクリメントの主キーがあり、すべてのメッセージが本質的に最新の日付である場合...ただし、それがわからないため、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
DRapp