1

さて、同じ質問をもう一度投稿していますが、今回は別の解決策でうまくいくかもしれません。

次のフィールドを持つメッセージテーブルがあります。

1) id(pk)、from_id(fk)、to_id(fk)、date_entered、メッセージ

私の要件は次のとおりです。

ログイン ユーザーに他のユーザーとの最後のメッセージを表示する必要があります。例えば

「mahendra」は、ユーザーが「john」と 5 メッセージ、「smith」と 3 メッセージと通信したログインです。

これらの 5 および 3 メッセージ内で、ログイン ユーザー (mahendra) は送信者 (from_id) または受信者 (to_id) である可能性があります。

各ユーザーのログイン ユーザーとの最後の通信を表示する必要があります。このようなもの

1) mahendra-john - これは mahendra と john の間の最後のメッセージです 2) mahendra-smith - これは mahendra と smith の間の最後のメッセージです

私の最後の投稿では、これを達成するためのクエリを取得できませんでした。これが私がしたことです。

$result=mysql_query("SELECT * FROM messages WHERE from_id=$_SESSION['userid'] OR to_id=$_SESSION['userid'] ORDER BY date_entered DESC");

これで、ログイン ユーザーが送信者または受信者のいずれかであるすべてのレコードが得られました。

ここで、他のユーザー (john と smith) と mahendra 内の最後のメッセージをフィルター処理して、他の配列に取り込む必要があります。

どのようにそれを行うことができますか?

4

2 に答える 2

2
SELECT  b.Name Fromname,
        c.name ToName,
        a.date_entered,
        a.Message
FROM
        (
            SELECT  *
            FROM    Messages
            where   (LEAST(from_id, to_id), GREATEST(from_id, to_id), date_entered) IN
                    (
                        SELECT  LEAST(from_id, to_id) as fromID, 
                                GREATEST(from_id, to_id) as toID, 
                                MAX(date_entered) as date_entered
                        FROM    Messages 
                        GROUP   BY fromID, toID
                    )
        ) a
        INNER JOIN UserList b
            ON a.from_id = b.ID 
        INNER JOIN UserList c
            ON a.to_ID = c.ID
WHERE   'Mahendra' IN (b.name, c.Name)

簡単な説明

クエリ全体を分解してみましょう。クエリの核心はこれです。

SELECT  *
FROM    Messages
where   (LEAST(from_id, to_id), GREATEST(from_id, to_id), date_entered) IN
        (
            SELECT  LEAST(from_id, to_id) as fromID, 
                    GREATEST(from_id, to_id) as toID, 
                    MAX(date_entered) as date_entered
            FROM    Messages 
            GROUP   BY fromID, toID
        )

クエリが行うことは、MySQL の関数を使用してMessagesテーブルからすべてのユーザーの最新の会話を取得することです。テーブル(ユーザー名のリストを含むテーブル)のサブクエリを 2 回結合する理由は、このテーブルに依存する次の 2 つの列があるためです。LEAST()GREATEST()UserListfrom_idto_id

于 2013-04-01T07:20:41.253 に答える