0

メッセージングシステム用に次の3つのテーブルがあります。

`messaging_messagethread`
- id
- subject
- initiator_id # who creates the thread
- recipient_id

`messaging_message`
- id
- thread_id
- content
- timestamp
- sender_id

`messaging_messagestatus` # a status will be created for each recipient of a message
- id
- message_id
- recipient_id
- status

ユーザーを指定して、次を取得するためのクエリを作成する必要があります。

  • スレッドIDを表示(個別)、
  • contentそしてtimestampそのスレッドの最新のメッセージの
  • 最新のメッセージを含むスレッドをすべて削除しますstatus='deleted'

これが私がこれまでに持っているものです:

SELECT DISTINCT thread.id as thread_id, timestamp.timestamp 
    FROM messaging_messagethread thread 
INNER JOIN 
    (SELECT thread_id, MAX(timestamp) as timestamp
      FROM messaging_message GROUP BY thread_id) timestamp
      ON thread.id = timestamp.thread_id
WHERE initiator_id = 4 OR thread.recipient_id = 4 ORDER BY timestamp.timestamp DESC

これにより、最新のタイムスタンプ順に並べられた個別のスレッドIDが得られます。(私の最初の3つのポイント)。クエリ全体をどのように作成しますか?

4

2 に答える 2

1

相関サブクエリを使用して、特定のスレッドの最新のメッセージを取得できます。これを試して:

SELECT 
    a.id, 
    b.content, 
    b.timestamp
FROM
    messaging_messagethread a
INNER JOIN
    messaging_message b ON a.id = b.thread_id 
WHERE 
    b.timestamp = 
    (
        SELECT MAX(timestamp) 
        FROM messaging_message 
        WHERE thread_id = a.id
    )
    AND b.id NOT IN
    (
        SELECT message_id
        FROM messaging_messagestatus
        WHERE status = 'deleted'
    )
    AND 4 IN (a.initiator_id, a.recipient_id)
ORDER BY
    b.timestamp DESC

私があなたのことを正しく理解していれば、これがあなたの望みだと思います。

于 2012-06-10T00:08:20.667 に答える
0

問題は、各スレッドから最新のメッセージが必要なことです。残念ながら、グループ AFAIK 内でトップ メンバーを取得する方法はありませんid ...ああ、メッセージが削除されていないことを確認しています。これが正しいかどうかはわかりません。

ただし、プログラミング言語や複数のクエリを使用するなど、別のアプローチを再検討してください。これは遅くなる原因...

SELECT thread_id, content, timestamp
FROM messaging_message
WHERE messaging_message.id IN
(
    SELECT messaging_message.id
    FROM messaging_message
        INNER JOIN messaging_messagestatus ON
            (messaging_messagestatus.message_id = messaging_message.id)
    WHERE messaging_message.thread_id IN
            (SELECT DISTINCT id 
             FROM messaging_messagethread
             WHERE initiator_id = 4 OR recipient_id = 4) AND
         messaging_messagestatus.status != 'deleted'
     ORDER BY timestamp DESC
     LIMIT 1
)
ORDER BY timestamp DESC

幸運を。

于 2012-06-09T06:08:36.317 に答える