2012-02-07 111 views
1

需要爲所有用戶和個人消息實現公共消息的傳遞。查詢 - 向用戶發送公共和私人消息

簡表:

messages 
+---------------+---------------------------+ 
| Field   | Type      | 
+---------------+---------------------------+ 
| id   | int(10) unsigned   | 
| admin_id  | int(10) unsigned   | 
| type   | enum('public','targeted') | 
| subject  | text      | 
+---------------+---------------------------+ 

messages_read_status 
+----------------+---------------------------------+ 
| Field   | Type       | 
+----------------+---------------------------------+ 
| id    | int(10) unsigned    | 
| message_id  | int(10) unsigned    | 
| user_id  | int(10) unsigned    | 
| status   | enum('unread','read')   | 
+----------------+---------------------------------+ 

當發送公共消息 - 在 messages_read_status表記錄未創建。用於定位消息 - 創建記錄未讀狀態。當用戶讀取消息時 - 設置讀取狀態。

客戶端的兩個過濾器 - 讀/未讀。消息類型對用戶無關緊要。

主要任務 - 創建查詢,以請求已讀或未讀消息用戶,而不管類型的消息的。

的主要問題是在查詢請求來處理公衆未讀郵件,因爲可以在 messages_read_status沒有他們的記錄。當某些用戶閱讀郵件時,UNREAD查詢可以正常工作。然後在 messages_read_status創建的新記錄和其他用戶不能再看到此消息。這種情況我無法解決。 READ查詢正常工作。

SELECT messages.* FROM messages 
LEFT JOIN messages_read_status 
ON messages.id = messages_read_status.message_id 
WHERE 
{OTHER FILTERS} AND 
(messages_read_status.`id` IS NULL OR (messages_read_status.`user_id` = $user_id AND messages_read_status.`message_status` = '$message_status')) 

samlpe SQL - http://sqlfiddle.com/#!2/d940d

謝謝

+0

+1爲sqlfiddle.com鏈接。 – Pursuit 2012-02-07 19:56:30

回答

0

獲得途徑未讀

SELECT messages.* FROM messages 
LEFT JOIN messages_read_status 
ON (
    messages.id = messages_read_status.message_id AND 
    messages_read_status.`user_id` = $user_id 
) 
WHERE 
{OTHER FILTERS} AND 
((messages_read_status.`id` IS NULL AND messages.type='public') OR messages_read_status.`status` = 'unread') 

和讀取使用簡單的規則

(公開+定向)