2017-09-14 3 views
0

Ich versuche, eine Liste der Gespräche und die damit verbundenen Teilnehmer in einer Zeile zusammen mit der letzten Nachricht für einen bestimmten Benutzer zu erhalten. Das Ergebnis, das ich suche, ist das:SQL Query mehrere Werte der gleichen Spalte in einer Zeile

**| conversationId | participants | text | timestamp |** 
      67   aester,bester Hello 00:00:00 

Das obige Modell ist nur eine Zeile. Ich versuche alle Zeilen mit dem obigen Ergebnis zu erhalten. Die Textspalte ist die letzte dieser Konversation zugeordnete Nachricht.

Hier sind meine Modelle:

Benutzer

userId|username| 
    87 aester 
    89 cester 
    96 bester 

Conversations

|conversationId| 
     67 
     68 

Nachrichten

| messageId | text | timestamp | conversation_id | user_id 
    41  Hello  00:00:00   67    87 
    42  Hey  00:00:00   68    89 

UserConversations

| id | conversation_id | user_id 
    3   67   87 
    4   67   96 
    5   68   89 

Wie kann ich die oben genannten Modelle abfragen, um das gewünschte Ergebnis zu erhalten?

CURRENT UPDATE:

SELECT conversations.`conversationId` as conversationId, 
GROUP_CONCAT(users.`username`) as participants FROM users 
LEFT JOIN user_conversations 
ON users.`userId` = user_conversations.`user_id` 
LEFT JOIN conversations 
ON user_conversations.`conversation_id` = 
conversations.`conversationId` 
WHERE EXISTS (SELECT * FROM user_conversations WHERE 
user_conversations.user_id = 87) 
GROUP BY conversations.`conversationId`; 

Die oben wird diese Herstellung das ist, was ich will, außer ich herausfinden kann nicht, wie sich die letzten Meldungen in jeder Zeile erhalten auch:

| conversationId | participants | 
     67   aester,bester 
     68    cester 
+1

Prüfung [** GROUP_CONCAT() **] (https://www.w3resource.com/mysql/aggregate-functions-and-grouping/aggregate-functions-and-grouping-group_concat.php) –

+0

Ich habe versucht, mit GROUP_CONCAT, aber es gibt alle Teilnehmer in der gleichen Zeile zurück, auch wenn sie nicht zur Konversation gehören – samuscarella

+0

Zeige uns db Schema, Beispieldaten, aktuelle und erwartete Ausgabe. \t Bitte lesen Sie [** How-to-Frage **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein toller Ort, um [** START **] (http://spaghettiba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) um zu erfahren, wie Sie die Qualität Ihrer Fragen verbessern und bessere Antworten erhalten. \t [** So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel **] (http://stackoverflow.com/help/mcve) –

Antwort

0

aussieht Wenn Sie eine Liste der Unterhaltung wollen, dann zum ersten Mal starten wir mit UserConversations für jeden conversation_id

die Liste der Teilnehmer zu erhalten
SELECT uc.`conversation_id`, 
     GROUP_CONCAT(u.`username`) as participants  
FROM UserConversations1 uc 
JOIN Users1 u 
    ON uc.`user_id`= u.`userId` 
GROUP BY `conversation_id` 
HAVING COUNT(IF(uc.`user_id` = 87, 1, NULL)) > 0; 
    -- This check if the user in on the conversation. 

Dann fanden wir, was die letzte Nachricht für jede

SELECT `conversation_id` , MAX(`messageId`) as `messageId` 
FROM Messages1 
GROUP BY `conversation_id`; 
war

Dann kommen wir alles zusammen:

SQL DEMO

SELECT conversation.`conversation_id`, 
     conversation.`participants`, 
     m.text, 
     m.timestamp 
FROM ( SELECT uc.`conversation_id`, 
       GROUP_CONCAT(u.`username`) as `participants`  
     FROM UserConversations1 uc 
     JOIN Users1 u 
      ON uc.`user_id`= u.`userId` 
     GROUP BY `conversation_id` 
     HAVING COUNT(IF(uc.`user_id` = 87, 1, NULL)) > 0) as conversation 
JOIN (SELECT `conversation_id` , MAX(`messageId`) as `messageId` 
     FROM Messages1 
     GROUP BY `conversation_id`) as last_message 
    ON conversation.`conversation_id` = last_message.`conversation_id` 
JOIN Messages1 m 
    ON m.`messageId` = last_message.`messageId`; 

OUTPUT

enter image description here

HINWEIS: Ich habe 1 zu Tabellennamen hinzugefügt werden, da einige Tabellen bereits waren die Plattform, wo ich die Demo gemacht habe und könnte Lass es nicht fallen.

+0

Danke! Es scheint zu funktionieren. – samuscarella

0

Wenn ich verstehe, Wenn Sie Ihre Frage richtig beantworten, möchten Sie Ihre vorhandene Abfrage mit der Tabelle "Nachrichten" so verknüpfen, dass Sie die letzte Nachricht für jede Konversation erhalten. Dies kann so gemacht werden.

Zuerst eine Unterabfrage erstellen für jedes Gespräch letzte Meldung zu bekommen wie diese

select message_id as last_message_id, text as last_text, conversation_id, user_id, max(timestamp) from   
(select * from `Messages` 
order by conversation_id, timestamp desc)q 
group by conversation_id; 

Jetzt als Join-Bedingung der obige Unterabfrage mit Kriterien conversation_id Joinspalte.Dies wird bevölkert letzte Meldung gegen Ihr Ergebnis

Ihre letzte Abfrage wie diese

SELECT conversations.`conversationId` as conversationId, 
GROUP_CONCAT(users.`username`) as participants FROM users 
LEFT JOIN user_conversations 
ON users.`userId` = user_conversations.`user_id` 
LEFT JOIN conversations 
ON user_conversations.`conversation_id` = 
conversations.`conversationId` 
WHERE EXISTS (SELECT * FROM user_conversations WHERE 
user_conversations.user_id = 87) 
LEFT JOIN 
(select message_id as last_message_id, text as last_text, conversation_id, user_id, max(timestamp) from   
(select * from `Messages` 
order by conversation_id, timestamp desc)q 
group by conversation_id) subquery 
on conversations.`conversationId` = subquery.`conversation_id` 
GROUP BY conversations.`conversationId`; 
Verwandte Themen