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番目のメッセージです」という最新のレコード/メッセージです。
乾杯
これは機能する可能性があります(ただし、保証はされません)。
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
次のようにクエリをGROUPBYでラップして、ORDERBYの後にGROUPBYを実行します。
SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from
メッセージテーブルに自動インクリメントの主キーがあり、すべてのメッセージが本質的に最新の日付である場合...ただし、それがわからないため、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