2008-09-16 2 views
0

Я хочу вести список глобальных сообщений, которые будут отображаться всем пользователям веб-приложения. Я хочу, чтобы каждый пользователь мог отмечать эти сообщения как прочитанные индивидуально. Я создал 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 

Немного сложно, и я не уверен, как производительность будет масштабироваться, но он должен работать.

Смежные вопросы