2016-04-26 6 views
0

Ich versuche, eine Konversationsliste wie WhatsApp neu erstellen, wo es den Kontaktnamen der Person, mit der Sie eine Unterhaltung haben und auch die Uhrzeit der Nachricht und auch gepostet Die letzte Nachricht, unabhängig davon, ob sie von Ihnen stammt oder von dem Kontakt, der die Nachricht gepostet hat. Mit anderen Worten, ich muss immer den Kontaktnamen und das letzte Mal sehen, wann die Nachricht gepostet wurde und die letzte Nachricht, die von mir oder der Empfänger, muss ich auch das Bild des anderen Benutzers aus der Benutzertabelle zurückholen. entlangMySQL beitreten 2 Tabellen und den neuesten Zeitstempel und Nachricht

Tabelle Benutzer

userid | first_name |  url   | 
--------------------------------------------- 
101 | name1  | www.image_url1.jpg | 
102 | name2  | www.image_url2.jpg | 
103 | name3  | www.image_url3.jpg | 
104 | name4  | www.image_url4.jpg | 

MELDUNGEN TABLE

MessageId | userid | senderid | message | timestamp | 
----------------------------------------------------------- 
    1  | 101 | 102 | message1 | 1234567 | 
    2  | 102 | 101 | message2 | 1234578 | 
    3  | 101 | 102 | message3 | 1235679 | 
    4  | 104 | 101 | message4 | 1256379 | 

Was ich versuche, aus der Datenbank abfragen, wenn meine Benutzer-ID = 101 die letzte Nachricht und Zeitstempel entweder von mir oder den Kontakt mit den Kontakten Benutzer-ID, Vorname und URL

1) Ich möchte die Verwendung extrahieren rid,
2) und die neueste Nachricht und Zeitstempel aus der Nachrichtentabelle Auszug aus dem Kontakt

Also mit anderen Worten muss ich entweder first_name und URL der Kontakt von der Benutzer-Tabelle geschrieben, die letzte Nachricht und Zeitstempel zeigen ich oder der andere Kontakt aus der Nachrichtentabelle und die URL und der Benutzername aus der Benutzer-Tabelle, aber nicht mein Benutzername und Bild-URL nur die Kontakte. Hier

ist die Abfrage Ich habe bisher

SELECT DISTINCT users.userid, users.first_name, users.url, message, MAX(messages.timestamp) AS utime FROM messages JOIN users ON users.userid = messages.senderid WHERE users.userid <> '101' AND (messages.userid = '101' OR messages.senderid = '101') GROUP BY 1,2,3 ORDER BY utime DESC 

Ich habe versucht, auch die, unter dem nicht ganz Arbeit

SELECT DISTINCT mems.userid, mems.first_name, mems.url, message, MAX(messaging.timestamp) AS utime 
FROM messaging 
JOIN mems 
ON mems.userid = CASE 
       WHEN 
         messaging.senderid = '101' 
        THEN 
         messaging.userid 
        ELSE 
         messaging.senderid 
       END 
WHERE mems.userid <> '101' AND (messaging.userid = '101' OR messaging.senderid = '101') 
GROUP BY 1,2,3 ORDER BY utime DESC 
+0

Wenn Sie diese Art von Frage veröffentlichen, ist es auch üblich, Ihren Versuch zu posten. – e4c5

+0

Sorry, gewöhne dich immer noch an diese Seite – TRicks

+0

Keine Sorge. Wenn du es selbst herausgefunden hast, darfst du deine eigene Antwort auf die Frage posten und sie als korrekt akzeptieren. – e4c5

Antwort

1

So etwas wie das sollte funktionieren.

SELECT IF(m.userid = '101', m.senderid, m.userid) contact, m.message, m.timestamp, u.first_name, u.url 
FROM messages m 
INNER JOIN(
    SELECT MAX(timestamp) max_time, IF(userid = '101', senderid, userid) contact 
    FROM messages 
    WHERE userid = '101' OR senderid = '101' 
    GROUP BY contact 
) j ON j.contact = IF(m.userid = '101', m.senderid, m.userid) AND m.timestamp = j.max_time 
LEFT JOIN users u ON u.userid = IF(m.userid = '101', m.senderid, m.userid) 

P.S. Dies sagt Ihnen nicht, wer die neuesten Nachrichten (Sie oder Ihr Kontakt) gesendet hat. Es könnte nützlicher sein, sowohl die Absender-ID als auch die Benutzer-ID für jede Ergebniszeile zu erhalten, anstatt nur die Kontakt-ID.

+0

Das sieht gut aus, aber ich bekomme eine Fehlermeldung "Unbekannte Spalte 'm.contact' in 'on Klausel'" – TRicks

+0

Ja, mein Schlechter, habe die Abfrage nicht vorher getestet. Ich habe die Abfrage bearbeitet und jetzt sollte es funktionieren. Habe es aber immer noch nicht getestet, also nimm mein Wort nicht dafür. Könnte es testen, wenn ich nach Hause komme. – jussius

+0

Getestet auf sqlfiddle und es scheint zu funktionieren. – jussius

0

versuchen so etwas wie:

select * from (
select m.senderId userid, 
     u.first_name, 
     u.url, 
     m.message, 
     m.timestamp   
from users u inner join messages m 
       on u.userid=m.userid 
order by timestamp desc 
) t 
limit 1; 
+0

Nein, das bringt nur 1 Datensatz zurück und verbindet nur users.userid = messages.userid aber wenn der andere Benutzer Wenn Sie auf die Nachricht antworten, muss der user.usersid der Nachricht messaging.senderid beitreten. Ich nehme an, ein CASE WHEN kann in diesem Fall verwendet werden? Aber es bringt immer noch nicht die letzte Nachricht aus der Nachrichtentabelle und den Kontaktnamen Abend zurück, obwohl sie die Absender-ID sein könnten, abhängig davon, wer die letzte Nachricht gesendet hat, aber wenn es ich war, möchte ich immer noch den Kontakt anzeigen. – TRicks