2014-04-09 59 views
0

我正在使用現有的無法修改的數據庫結構的聊天系統。在同樣的結果下重複mysql結果

我試圖獲取特定用戶離線時收到的消息(假設用戶是我)。

目前,我的查詢給我的結果,如:

[ { username: 'Chico', 
    message: 'chicoMessage1', 
    sentBy: 23 }, 
    { username: 'rep', 
    message: 'repMessage1', 
    sentBy: 59 }, 
    { username: 'Chico', 
    message: 'chicoMessage2', 
    sentBy: 23 }, 
    { username: 'rep', 
    message: 'repMessage2', 
    sentBy: 59 } ] 

上述結果意味着用戶「奇科」給我發了2個消息,並且用戶「代表」送我2爲好。我們看到消息的內容以及消息發送者的ID。

我希望得到的最終結果,因此我可以高效地使用它,將每個用戶名的上面的內容分組到相同的用戶名下。

所以基本上類似的東西,將是一件好事:

[ { username: 'Chico', 
    messages: ['chicoMessage1', 'chicoMessage1' ], 
    sentBy: 23 }, 
    { username: 'rep', 
    messages: ['repMessage1', 'repMessage2' ], 
    sentBy: 59 } ] 

我能做到這與MySQL?這裏的查詢我現在(的結果在前面提到的結果):

SELECT tusers.username, messages.message, messages.sentBy 
    FROM messages 
    JOIN offlineconversations 
    ON messages.messageID = offlineconversations.messageID 
    JOIN tusers 
    ON tusers.id = messages.sentBy \ 
    WHERE offlineconversations.userID = 100; 

的表格看起來像:

tusers

ID |用戶名|密碼

消息

MESSAGEID |消息| sentBy

offlineconversations

用戶ID | messageID

MySQL可以實現我想要的嗎?如果不是,你會怎麼做(在JS中)?

謝謝

回答

1

使用GROUP_CONCAT函數和GROUP BY子句:
https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

SELECT tusers.username, messages.sentBy, 
     GROUP_CONCAT(messages.message) As messages 
    FROM messages 
    JOIN offlineconversations 
    ON messages.messageID = offlineconversations.messageID 
    JOIN tusers 
    ON tusers.id = messages.sentBy 
    WHERE offlineconversations.userID = 100 
GROUP BY tusers.username, messages.sentBy; 
+0

我也有在'messages'表 'createdAt' 時間戳列,我怎麼可能用它來訂購從最新到最舊的郵件? –

+1

使用'GROUP_CONCAT(messages.message ORDER BY createdAt DESC)' – krokodilko

+0

真棒,謝謝!我添加了SEPARATOR'-_-_-',然後通過JS將該字符串與該分隔符分開,以創建一個消息數組。有沒有一種更理想的方式直接從MySQL中獲得該數組?謝謝 –