1

Twitter の DM サービスに似た既存のメッセージング システムを再構築しようとしています。現在、未読メッセージのみをユーザーに表示していますが、次のように 2 人のユーザー間で送信されたメッセージを単一の「スレッド」で表示したいと考えています。

ここに画像の説明を入力

これが私の現在のデータベース構造といくつかのサンプルデータです: http://sqlfiddle.com/#!2/574e3/1/0

クエリを分解して段階的に作成しようとしましたが、混乱しています。これは、私が行った手順のリストです。

1. 2 人のユーザー間で送信されたメッセージのリストを取得する

SELECT * FROM uc_user_messages
WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1

2. 2 人のユーザー間の「会話」の最後のメッセージを表示する

SELECT * FROM uc_user_messages
WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1
ORDER BY timestamp DESC

3. 会話を user_id でグループ化します (明らかに、これは実稼働アプリケーションで多数の結合を持つユーザーの名前になります)。

SELECT * FROM uc_user_messages
WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1
GROUP BY uc_user_messages.user_id_1 AND uc_user_messages.user_id_2
ORDER BY timestamp DESC 

そして、これが私が立ち往生している場所です...問題は、2人のユーザー間の会話で送信された最初のメッセージが、最新のメッセージではなく表示されることです: http://sqlfiddle.com/#!2/942fb/ 2

これについて何ができますか?データベースの設計に大きな変更を加える必要がないことを願っています。どんな助けでも大歓迎です。

乾杯、

ジョエル

4

2 に答える 2

5
SELECT  *
FROM    uc_user_messages
WHERE   (LEAST(user_id_1, user_id_2),GREATEST(user_id_1, user_id_2),TIMESTAMP) 
        IN 
        (
            SELECT  LEAST(user_id_1, user_id_2) AS x,
                    GREATEST(user_id_1, user_id_2) AS y,
                    max(TIMESTAMP) AS msg_time
            FROM    uc_user_messages
            GROUP   BY x, y
        );

出力

╔════╦═══════════╦═══════════╦═════════════════╦════════════╦══════╗
║ ID ║ USER_ID_1 ║ USER_ID_2 ║     MESSAGE     ║ TIMESTAMP  ║ READ ║
╠════╬═══════════╬═══════════╬═════════════════╬════════════╬══════╣
║  3 ║         1 ║         2 ║ third message   ║ 1366577336 ║    1 ║
║  4 ║         2 ║         0 ║ a message reply ║ 1366577346 ║    1 ║
╚════╩═══════════╩═══════════╩═════════════════╩════════════╩══════╝
于 2013-05-10T16:56:30.787 に答える
1

私があなたのことを正しく理解していて、ユーザー 1 と 2 の間の最新のメッセージを探していると仮定すると、これが 1 つの方法です。

SELECT * FROM uc_user_messages
WHERE id = (
  SELECT MAX(id) FROM uc_user_messages
  WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1
)

ただし、これは上昇していることに依存してidいますが、これは良い考えではないかもしれません. 別の方法として を使用するtimestampこともできますが、これは、それらのユーザーに対して一意であることが保証されている場合にのみ機能します。

于 2013-05-10T17:07:07.240 に答える