3

次のように設定されたテーブルMessagesがあります。

ここに画像の説明を入力してください

このテーブルには、ユーザー間で送信されるすべてのメッセージが格納されますが、FaceBookのメッセージシステムのようである必要があります。

これを行うには、私のクエリは次のようなものである必要があります。

SELECT*FROMメッセージWHERETo_User= x OR From_User = x ORDER BY Time DESC

これにより、送信または受信されたすべてのメッセージ「x」が時間順にフェッチされ、最新のメッセージが最初に表示されます。

ただし、Facebookのシステムはそれをフォーラムのように維持しているので、特定のクエリ結果に人yが関与しているメッセージを1つだけ表示します。だから私はこれが起こらないようにしたい:

To_User:6 From_User:7ステータス:あなたのメッセージに同意します時間:12345

To_User:7 To_User:6ステータス:私のメッセージに同意しますか?時間:12344

ユーザー6のメッセージページを表示していたとすると、両方のメッセージが現在のシステムに表示されます。代わりに、すべてではなく、ユーザー6と7の間の最新のメッセージのみを表示したいので、一番上のメッセージのみを選択する必要があります。

当然、これは通常LIMITステートメントを要求するだけですが、多くのメッセージを取得できる必要がありますが、唯一のルールは次のとおりです。

1-FROMまたはTOユーザーXである必要があります2-FROMまたはTOユーザーYの2つのメッセージを選択する必要はありません3-選択されたメッセージは、ユーザーXとYの間の会話で最新である必要があります

これを説明するのは本当に難しいですが、解決策として十分に詳細に説明したことを願っています。

GROUP BYを実行することを検討しましたが、toだけまたはfromだけではなく、FROMまたはTOのいずれかであるものを見つける必要があることを考慮に入れることができませんでした。

質問が十分に詳しく説明されていない場合は、反対票を投じる前に教えてください。もう少し詳しく説明するように最善を尽くしますが、何を明確に表示する必要があるかを説明する言葉が思い浮かびません。 。

編集:

必要な機能の大きな例を次に示します。

John Doeにメッセージを送信し、その直後にメッセージページに移動したとしましょう。一番上に、次のように表示されます。

「ジョン・ドウへ」「私が送ったメッセージ」

ただし、John Doeが返信すると、そのエントリはページに表示されなくなり、私とJohn Doeの間の会話で最新のエントリに置き換えられるため、実際のエントリがデータベースに残っている間は表示されません。もう:

「JohnDoeから」「あなたのメッセージは面白い」

しかし、後でJane Doeに送信すると、私とJohn Doeの会話がプッシュされるため、次のようになります。

「ジェーンドゥへ」「こんにちは」

「JohnDoeから」「あなたのメッセージは面白い」

この投稿で述べた最初のクエリでは、結果は次のようになります。

「ジェーンドゥへ」「こんにちは」

「JohnDoeから」「あなたのメッセージは面白い」

「ジョン・ドウへ」「私が送ったメッセージ」

ただし、私とJohn Doeの間にある複数の列を表示したくないのですが、テーブル内の2つの異なる列(Fromと2)を見て、IとJohn Doeの両方が関連しているかどうかを判断しているので、通常のGROUPBYステートメントが機能するとは思わない。

さらに、Bob Joeが私にメッセージを送信した場合、次のようになります。

「ボブジョーから」「こんにちは」

「ジェーンドゥへ」「こんにちは」

「JohnDoeから」「あなたのメッセージは面白い」

4

2 に答える 2

2

テーブルを自己結合し、外部結合を使用して、「以前の」メッセージが「以前の」メッセージを「除外」するようにすることができます。

SELECT * FROM Messages main LEFT JOIN Messages earlier
    ON earlier.time < main.time AND 
        (
            earlier.To_User = main.To_User AND earlier.From_User = main.From_User OR  
            earlier.To_User = main.From_User AND earlier.From_User = main.To_User
        )
WHERE (main.To_User = x OR main.From_User = x) AND earlier.id IS NULL
ORDER BY main.Time DESC
于 2012-05-27T20:07:56.533 に答える
1

「from」列または「to」列のいずれかに表示される人の複雑さを排除できれば、これはグループ内の最小行を見つけるという一般的な問題の例になります。だからあなたはこれから始めることができます:

SELECT id, time, to_user as user
UNION ALL SELECT id, time, from_user as user

次に、そのクエリの結果を、標準の最小行手法のいずれかへの入力として使用します。

于 2012-05-27T20:13:41.140 に答える