2017-02-21 27 views
0

我是發送通知消息給多個設備用戶可以從多個設備登錄。我有單獨的表,它維護每個用戶的設備ID。當我發送通知時,我會在message_data中添加用戶標識,消息等。,我會在每個用戶設備的message_status表中添加一個條目。用於統計用戶未讀消息的MySQL查詢

這樣我就可以維護每個設備通知發送狀態和錯誤。

message_data 
id   INT  
userid  VARCHAR 
message  VARCHAR 
sent_time DATETIME 
language TINYINT 

message_status 
id    INT 
data_id   INT 
device_id  VARCHAR 
device_type  TINYINT 
sent_time  DATETIME 
status   TINYINT 
error_code  TINYINT (If there is any error, we will have the error code here) 

我想獲取每個用戶的未讀通知消息數。狀態字段0表示該設備的消息尚未被用戶讀取。如果它是1,則用戶已閱讀該消息。

用戶可以從多個設備登錄,如果用戶在至少一個設備上讀取該消息,則應該視爲通知消息被讀取。

如果用戶在任何設備上未讀取通知消息,則需要將其視爲未讀消息。

如何識別未讀通知消息數的用戶?對此有何想法?

+0

您需要查看是否有另一個status = 1的message_status,因此,對於WHERE device_id = AND status = '使用JOIN或NOT EXISTS。 – mroman

+0

@mroman我需要通過userid獲取未讀郵件數。用戶可以有許多註冊的設備。 – Muthu

+0

是'user_id'唯一嗎? – Fabio

回答

1
Select 
    m.*, -- m.user_id 
    IF (SUM(s.status) > 0, 1, 0) has_un_read, 
    SUM(s.status) unread_messages_count 
From message_data m 
INNER JOIN message_status s on m.id = s.data_id 
Group By m.id 
having SUM(s.status) > 0 

如果status場比01等多個國家,那麼你可以這樣做:

Select 
    m.*, 
    IF(SUM(IF(s.status = 1, 1, 0)) > 0, 1, 0) has_un_read, 
    SUM(if(s.status = 1, 1, 0)) unread_messages_count 
From message_data m 
INNER JOIN message_status s on m.id = s.data_id 
Group By m.id 

UPDATE

如果要區分未讀郵件每個設備:

Select 
    m.*, 
    s.device_id, 
    IF (SUM(s.status) > 0, 1, 0) has_un_read, 
    SUM(s.status) unread_messages_count 
From message_data m 
INNER JOIN message_status s on m.id = s.data_id 
Group By m.id, s.device_id 
having SUM(s.status) > 0 
+0

如果除了讀取/未讀之外引入不同的狀態,則工作起來很危險。 – mroman

+0

@wajeeh會產生一個特定用戶的未讀郵件數量嗎? – Muthu

+0

沒有那麼危險,因爲'status'字段只能是'1'或'0',就像他問的那樣。 @mroman – wajeeh