2017-02-21 3 views
0

Ich bin Senden der Benachrichtigung an mehrere Geräte. Der Benutzer kann sich von mehreren Geräten aus anmelden. Ich habe separate Tabelle, die die Geräte-IDs jedes Benutzers verwaltet. Wenn ich die Benachrichtigung sende, werde ich einen Eintrag auf die Nachrichtendaten mit Benutzer-ID, Nachricht etc. setzen, werde ich einen Eintrag in der Tabelle message_status für jedes Benutzergerät.MySQL-Abfrage zum Zählen von Benutzern ungelesene Nachricht

So dass ich jedes Gerät Benachrichtigung Status und Fehler erhalten kann.

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) 

Ich möchte für jeden Benutzer die ungelesene Benachrichtigung Zahl erhalten. Statusfeld 0 bedeutet, dass die Nachricht für dieses Gerät vom Benutzer noch nicht gelesen wurde. Wenn es 1 ist, haben Benutzer die Nachricht gelesen.

Ein Benutzer kann sich von mehreren Geräten aus anmelden. Wenn der Benutzer die Nachricht in mindestens einem Gerät liest, sollte er als Benachrichtigungsnachricht gelesen werden.

Wenn die Benachrichtigungsmeldung nicht von einem Benutzer in einem Gerät gelesen wird, muss sie als ungelesene Nachricht betrachtet werden.

Wie identifiziert man die Benutzer mit ungelesenen Nachrichtenzählern? Irgendeine Idee dazu?

+0

Sie müssen herausfinden, ob es einen anderen message_status mit Status = 1 gibt, also verwenden Sie entweder einen JOIN oder einen NOT EXISTS mit 'WHERE device_id = UND status = '. – mroman

+0

@mroman Ich muss die Anzahl der ungelesenen Nachrichten von Benutzer-ID abrufen. Der Benutzer kann viele registrierte Geräte haben. – Muthu

+0

ist 'user_id' eindeutig? – Fabio

Antwort

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 

Wenn status Feld mehr als einen anderen Zustand als 0 hat und 1 dann können Sie das tun:

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

Falls Sie von nicht gelesenen Nachrichten unterscheiden wollen Jedes Gerät:

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

Funktioniert aber riskant, wenn Sie neben gelesen/ungelesen einen anderen Status einführen. – mroman

+0

@wajeeh Wird es die Anzahl der ungelesenen Nachrichten eines bestimmten Benutzers ergeben? – Muthu

+0

Nicht so riskant, weil das 'status'-Feld nur' 1' oder '0' sein kann, wie er gefragt hat. @Mroman – wajeeh

Verwandte Themen