2008-09-16 10 views
0

Webアプリケーションのすべてのユーザーに表示されるグローバルメッセージの一覧を維持したいと考えています。私は、各ユーザーがこれらのメッセージを個別に読み取りとしてマークできるようにしたいと思います。私は2つのテーブルを作成しました。 messages (id, body)およびmessages_read (user_id, message_id)ユーザーが未読メッセージを取得する

単一ユーザーの未読メッセージを選択するSQL文を提供できますか?またはこれを処理するためのよりよい方法についての提案がありますか?

ありがとうございます!

答えて

1

上記で定義したテーブル定義が完了している場合は、各メッセージの日付を含めて、日付順に並べ替えることができます。

SELECT id, message 
FROM messages 
LEFT JOIN messages_read 
    ON messages_read.message_id = messages.id 
    AND messages_read.[user_id] = @user_id 
WHERE 
    messages_read.message_id IS NULL 

また、これは、選択を行うには、わずかにより効率的な方法かもしれません

5

さて、あなたは

SELECT id FROM messages m WHERE m.id NOT IN(
    SELECT message_id FROM messages_read WHERE user_id = ?) 

使用することができますか?あなたのアプリによって渡されます。

0

ような何か:ややトリッキー

SELECT id, body FROM messages LEFT JOIN 
    (SELECT message_id FROM messages_read WHERE user_id = ?) 
    ON id=message_id WHERE message_id IS NULL 

と私はパフォーマンスがスケールアップしますが、それがどのように動作するかをわかりません。

関連する問題