メッセージを会話としてグループ化して、会話として読むことができるようにしようとしています。
これは私が今持っているものです
テーブルmessages
id | from | to | message | timestamp
1 | 1 | 2 | 'Hello' | 1351257766
2 | 1 | 3 | 'Hey!' | 1351257767
3 | 2 | 1 | 'Hay!' | 1351257768
messages.from
とフィールドmessages.to
はテーブルの行に対応しusers
ます。
私がやりたいことは次のとおりです:(同じクエリではありません)
を。ユーザーからのすべての会話の最後のメッセージのリストを取得します (つまり、from
またはto
が特定の b に等しい場合) user.id
。会話に属するすべてのメッセージを取得します。
SELECT
-- From-user:
users_from.id AS from_id,
users_from.username AS from_username,
users_from.nickname AS from_nickname,
users_from.username_safe AS from_username_safe,
users_from.password AS from_password,
users_from.email AS from_email,
users_from.rank AS from_rank,
users_from.email AS from_email,
users_from.ip AS from_ip,
users_from.last_online AS from_last_online,
users_from.register_stamp AS from_register_stamp,
users_from.state AS from_state,
users_from.icon AS from_icon,
-- To-user:
users_to.id AS to_id,
users_to.username AS to_username,
users_to.nickname AS to_nickname,
users_to.username_safe AS to_username_safe,
users_to.password AS to_password,
users_to.email AS to_email,
users_to.rank AS to_rank,
users_to.email AS to_email,
users_to.ip AS to_ip,
users_to.last_online AS to_last_online,
users_to.register_stamp AS to_register_stamp,
users_to.state AS to_state,
users_to.icon AS to_icon,
-- Messages:
messages.id,
messages.from,
messages.to,
messages.message,
messages.timestamp
FROM messages
-- Some joins to get the userdata
INNER JOIN users AS users_to
ON messages.to = users_to.id
INNER JOIN users AS users_from
ON messages.from = users_from.id
-- We only want the latest messages:
RIGHT JOIN (
SELECT
max(messages.id) AS maxid,
messages.from,
messages.to
FROM messages
WHERE messages.to = {userid} OR messages.from = {userid}
) limiter
ON messages.id = limiter.maxid
これは私が今使っているものですが、うまくいきません。会話の 1 つだけを返します。
皆さんが私がこの仕事をするのを手伝ってくれることを願っています!
更新: 与えられた答えはうまくいきませんでした。user-1 が user-2 にメッセージを送信すると、うまくいきました。ただし、user-2 が応答すると、別の会話が開始されます (結果の新しい行として)。