2017-09-14 215 views
0

我試圖在一行中獲取與它關聯的對話列表和與會者,以及給定用戶的最後一條消息。我正在尋找的結果是這樣的:SQL查詢同一行中同一列的多個值

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

上述模型只是一行。我正在試圖獲得具有上述結果的所有行。文本列是與該對話關聯的最後一條消息。

這裏是我的模型:

用戶

userId|username| 
    87 aester 
    89 cester 
    96 bester 

對話

|conversationId| 
     67 
     68 

消息

| 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 

如何查詢上述模型以獲得期望的結果?

當前的更新:

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`; 

以上是生產這是我想要的只是我無法弄清楚如何讓每行也是在最後的消息:

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

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

+0

我試圖使用GROUP_CONCAT,但它返回同一行上的所有參與者,即使它們不屬於對話 – samuscarella

+0

向我們顯示數據庫模式,樣本數據,當前和預期輸出。 \t請閱讀[**如何提問**](http://stackoverflow.com/help/how-to-ask) \t \t這裏是一個偉大的地方[** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)來了解如何提高您的問題質量並獲得更好的答案。 \t [**如何創建最小,完整和可驗證示例**](http://stackoverflow.com/help/mcve) –

回答

0

如果你想談話的名單,然後首先我們先從UserConversations得到與會者的列表中爲每個conversation_id

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. 

然後,我們發現了什麼是每個conversation_id

SELECT `conversation_id` , MAX(`messageId`) as `messageId` 
FROM Messages1 
GROUP BY `conversation_id`; 
0123的最後一條消息

然後我們一起都在一起:

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`; 

輸出

enter image description here

注:我來補充1表的名字,因爲一些表已經上我做演示的平臺,可以nt放下它。

+0

謝謝!它似乎在工作。 – samuscarella

0

如果我沒有理解你的問題正確,你想用Messages表加入你現有的查詢,這樣你可以得到每個對話的最後一條消息。這可以像這樣完成。

首先創建一個子查詢來獲得最後的消息對於每個對話是這樣

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; 

現在使用conversation_id列作爲連接條件與查詢上述子查詢。這將填充最後的消息對你的結果

你最終的查詢看起來像這樣

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`; 
相關問題