2017-12-15 4 views
2

Ich versuche, eine einfache Chat mit diesem Schema zu tun:MySQL-Datenbankschema für einfachen Chat 00.59

mes_id int(10) unsigned Auto Increment 
mes_useid_receiver int(10) unsigned  
mes_useid_sender int(10) unsigned  
mes_date int(10) unsigned  
mes_message text  
mes_read tinyint(3) unsigned [0] 
mes_visible_for_who int(10) unsigned NULL NULL = both; 0 = none; ID user 

Das Problem ist, wie ich die Liste der Kontakte der empfangenen Nachrichten erhalten und gesendeten Nachrichten ?

Ich versuche, etwas wie folgt aus:

SELECT use_name, MAX(mes_date) AS date 
FROM message JOIN user ON mes_useid_receiver=use_id 
WHERE uti_id!=1 
AND (mes_useid_receiver=1 OR mes_useid_sender=1) 
AND (mes_visible_for_who IS NULL OR mes_visible_for_who=1) 
GROUP BY use_id 
ORDER BY date DESC 

Aber mit dieser Abfrage kann ich die Kontakte erhalten nur die eine Nachricht an user_id = 1 senden, möchte ich auch die Kontakte erhalten, die User_id = 1 gesendete Nachrichten.

Edited:

Mit Vereinigung kann ich fast, dass ich will:

SELECT use_id, use_name, mes_read FROM message 
JOIN user ON mes_useid_receiver=use_id 
WHERE use_id!=1 
AND (mes_useid_receiver=1 OR mes_useid_sender=1) 
AND (mes_visible_for_who IS NULL OR mes_visible_for_who=1) GROUP BY use_id 

UNION 

SELECT use_id, use_name, mes_read FROM message 
JOIN user ON mes_useid_sender=use_id 
WHERE use_id!=1 
AND (mes_useid_receiver=1 OR mes_useid_sender=1) 
AND (mes_visible_for_who IS NULL OR mes_visible_for_who=1) GROUP BY use_id 

Ich brauche die mes_date die Liste zu bestellen, aber wenn ich die mes_date wählen werde ich doppelte Zeilen erhalten.

Danke für die Hilfe.

Antwort

1

wenn Sie wie unter meinem suggetion ist in dieser Wurzel dann etwas gehen:

SELECT * FROM(

    (SELECT use_id, use_name, mes_read ,mes_date FROM message 
    JOIN user ON mes_useid_receiver=use_id 
    WHERE use_id!=1 
    AND (mes_useid_receiver=1 OR mes_useid_sender=1) 
    AND (mes_visible_for_who IS NULL OR mes_visible_for_who=1)) GROUP BY use_id 

    UNION 

    (SELECT use_id, use_name, mes_read ,mes_date FROM message 
    JOIN user ON mes_useid_sender=use_id 
    WHERE use_id!=1 
    AND (mes_useid_receiver=1 OR mes_useid_sender=1) 
    AND (mes_visible_for_who IS NULL OR mes_visible_for_who=1)) GROUP BY use_id 

) as d Order By mes_date desc 

auch sehen, wenn Sie in jeder Auswahl Gruppierung in vermeiden können (Sie eine schlechte Leistung fühlen)

Grüße

+0

Danke! Die Gruppe von use_id kann außerhalb sein. – NAG