0

私はクエリを開発しようとしています

  1. currentUserID によって書き込まれなかったすべてのスレッドの最後のメッセージを提供します (現在は、thread_id によるグループ、message_id desc による順序、および WHERE results.sender_id != currentUserID で達成されます)。
  2. ユーザーがスレッドを開始したが応答を受信しなかった場合、スレッドは表示されません (現時点では、WHERE results.sender_id != currentUserID でデータをフィルタリングするだけで実現されます)。
  3. このスレッドで応答が送信されたかどうかを示すブール列を提供します (完了していませんが、クエリから最後の要素を見つけて、sender_id が現在ログインしているユーザー ID に等しいかどうかを確認する必要があります)。

http://sqlfiddle.com/#!2/85971/2

あらすじ

  • ユーザー 1 はユーザー 2 とメッセージを送信します。
  • スレッド ID: 1
  • 件名: 「こんにちは件名」
  • 本文:「ハイボディ」

  • ユーザー 2 は次のように応答します。

  • スレッド ID: 1
  • 本文: 「ハイ ボディ レスポンス」

ユーザー 1 として SQL が返されます

THREAD_ID |SUBJECT     | SENDER_ID | BODY             | Responded
1         | Hi Subject | 2         | Hi Body Response | false

ユーザー 2 として SQL が返される必要があります

THREAD_ID |SUBJECT     | SENDER_ID | BODY    | Responded
1         | Hi Subject | 1         | Hi Body | true

フィドルを見てください

それに対する私のショットは、1エーカーと2エーカーを必要とするが3エーカーを必要としない次のことでした。これを達成するためにUNIONSをいじろうとしましたが、どこにも行きませんでした。

SELECT * FROM (
    SELECT t.id as thread_id, t.subject, m.sender_id, m.body
    FROM messages m
    JOIN threads t ON (m.thread_id = t.id)
    ORDER BY t.id asc, m.cdate desc
) as results
WHERE results.sender_id != currentUserID
GROUP BY results.thread_id;
4

1 に答える 1

1

以下のクエリを確認してください。メッセージID列も追加しました。

最初の結果..。

SELECT t.id as thread_id, t.subject, m.sender_id, m.body, m.id,
(SELECT CASE s.status WHEN 1 THEN 'true' ELSE 'false' END 
 FROM STATUS s where s.message_id = m.id and s.user_id = 1) Responded
FROM messages m
JOIN threads t ON (m.thread_id = t.id)
WHERE m.sender_id != 1

二つ目...

SELECT t.id as thread_id, t.subject, m.sender_id, m.body, m.id,
(SELECT CASE s.status WHEN 1 THEN 'true' ELSE 'false' END 
 FROM STATUS s where s.message_id = m.id and s.user_id = 2) Responded
FROM messages m
JOIN threads t ON (m.thread_id = t.id)
WHERE m.sender_id != 2

ありがとう!

@leo。

于 2013-03-18T01:39:04.220 に答える