2008-09-16 9 views
0

Je souhaite gérer une liste de messages globaux qui seront affichés pour tous les utilisateurs d'une application Web. Je veux que chaque utilisateur soit capable de marquer ces messages comme lus individuellement. J'ai créé 2 tables; messages (id, body) et messages_read (user_id, message_id).Récupérer les messages non lus, par utilisateur

Pouvez-vous fournir une instruction sql qui sélectionne les messages non lus pour un seul utilisateur? Ou avez-vous des suggestions pour une meilleure façon de gérer cela?

Merci!

Répondre

1

Si les définitions de tables que vous avez mentionnées sont complètes, vous pouvez inclure une date pour chaque message afin de pouvoir les trier par date.

En outre, cela pourrait être une façon un peu plus efficace de faire la sélection:

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

Eh bien, vous pouvez utiliser

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

Où? est transmis par votre application.

0

Quelque chose comme:

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 

Un peu difficile et je ne suis pas sûr de savoir comment la performance intensifiera, mais il devrait fonctionner.

Questions connexes