2016-07-22 17 views
0

Hallo Ich versuche, eine direkte Nachricht Posteingang in PHP zu erstellen. Ich habe versucht, eine Abfrage zu erstellen, die die letzte Nachricht zwischen den angemeldeten Benutzern und allen Benutzern erhält, die entweder angemeldet sind oder eine Nachricht an den angemeldeten Benutzer gesendet haben. Ähnlich wie Insatagram und Twitter in ihren Posteingängen eine Liste aller Konversationen zwischen dem angemeldeten Benutzer und den Personen anzeigen, die sie benachrichtigt haben oder die Nachrichten gesendet haben.MySql Abfrage für direkte Nachricht

Ab sofort zeigt meine Abfrage alle Gespräche zwischen dem angemeldeten Benutzer und den Personen, mit denen ich Gespräche geführt habe, wenn ich nur die letzte Nachricht zwischen dem angemeldeten Benutzer und allen anderen Benutzern haben möchte. Ich hoffe, ich habe das gut genug erklärt.

Meine Abfrage-Anweisung ab jetzt ist:

SELECT * 
FROM dm 
WHERE(receiver="user") or (sender="user") 
ORDER BY senttime DESC; 

Meine direkte Nachrichtentabelle sieht wie folgt aus:

CREATE TABLE IF NOT EXISTS dm ( 
    id INT(11) NOT NULL AUTO_INCREMENT, 
    receiver VARCHAR(100) NOT NULL, 
    sender VARCHAR(100) NOT NULL, 
    senttime DATETIME NOT NULL, 
    message TEXT NOT NULL, 
    PRIMARY KEY (id) 
) 

Zum Beispiel:

id receiver sender  senttime   message 
1  Jack Will  2016-07-20 20:59:27  Hi 
2  Jack Bob  2016-07-21 20:59:27  What's up 
3  Bob Jack  2016-07-22 20:59:27  Hanging out what about 

soll die folgenden wenn Jack zurückkehren ist der Benutzer in der Abfrage

id receiver sender  senttime   message 
3  Bob Jack  2016-07-22 20:59:27  Hanging out what about you? 
1  Jack Will  2016-07-20 20:59:27  Hi 

Antwort

3

so etwas wie dieses Versuchen (siehe sqlfiddle):

SELECT * FROM dm 
INNER JOIN 
(
    SELECT MAX(id) as id FROM ( 
    SELECT MAX(id) as id, receiver as contact 
    FROM dm 
    WHERE sender="Jack" 
    GROUP BY receiver 
    UNION ALL 
    SELECT MAX(id) as id, sender as contact 
    FROM dm 
    WHERE receiver="Jack" 
    GROUP BY sender 
) t GROUP BY contact 
) d 
ON dm.id = d.id 
ORDER BY senttime DESC; 

Ausgang wird sein:

id receiver sender senttime    message 
3 Bob   Jack July, 22 2016 20:59:27 Hanging out what about 
1 Jack  Will July, 20 2016 20:59:27 Hi 

Führen Sie diesen Code für Testdaten zu erstellen:

CREATE TABLE IF NOT EXISTS dm ( 
    id INT(11) NOT NULL AUTO_INCREMENT, 
    receiver VARCHAR(100) NOT NULL, 
    sender VARCHAR(100) NOT NULL, 
    senttime DATETIME NOT NULL, 
    message TEXT NOT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO dm (receiver, sender, senttime, message) VALUES 
('Jack', 'Will', '2016-07-20 20:59:27', 'Hi'), 
('Jack', 'Bob', '2016-07-21 20:59:27', 'What\'s up'), 
('Bob', 'Jack', '2016-07-22 20:59:27', 'Hanging out what about'); 
+0

dies nicht Arbeit. Die Abfrage unterscheidet nicht zwischen den Sender- und Empfängerwerten mit Jack und Bob. – JoOlay

+0

Probieren Sie die neue Version des Codes –

+0

Vielen Dank, Mann! Es klappt! – JoOlay