1

メッセージを会話としてグループ化して、会話として読むことができるようにしようとしています。

これは私が今持っているものです

テーブル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 が応答すると、別の会話が開始されます (結果の新しい行として)。

4

1 に答える 1

2

あなたのクエリは近いですが、ユーザーごとにグループ化する必要があると思います. これは一つのアプローチです

RIGHT JOIN (
    SELECT
        max(messages.id) AS maxid,
        messages.from,
        messages.to
    FROM messages
    WHERE messages.to = {userid} OR messages.from = {userid}
    group by messages.from, messages.to
) limiter

あなたの会話の定義は、同じ 2 人のユーザーを持っているようです。これには、次を使用しますin

select m.*
from messages m
where `from` in ({userid1}, {userid2}) and
      `to` in ({userid1}, {userid2})

ちなみに、fromとは予約語なtoので、列名としては不適切です。from

于 2013-02-10T16:40:44.277 に答える