2013-07-23 15 views
0
SELECT * FROM conversation_1 
LEFT JOIN conversation_2 
ON conversation_1.c_id = conversation_2.c_id 

LEFT JOIN user 
ON conversation_2.user_id = user.user_id 

LEFT JOIN message 
ON conversation_1.c_id = message.c_id 

WHERE conversation_1.user_id=1 
GROUP BY message.c_id 


conversation_1  conversation_2 
c_id user_id  c_id user_id 
1  1   1  2 
2  1   2  3 
3  2 

我有一個消息DB建立在MySQLMysql的組通過提取最後一行

我做4代表的用戶,conversation_1,conversation_2,消息

當用戶試圖打開他的消息框,它會取出來的所有對話(conversation_1)

不是加入到用戶conversation_2和使用conversation_2找出哪些用戶

比加入到該消息。

c_id user_id  user_name message 
1  2   Alex  Hi user_1, this is user_2 
2  3   John  hi user_3, user_2 don't talk to me 

它工作得很好,但是我想顯示message最後一排GROUP BY

目前它這個組中顯示的第一行。

ps.conversation_1.c_id是自動遞增和C_ID將插入到conversation_2誰擁有加入此對話

+0

「* *最後」 未定義沒有明確排序的概念。你如何在你的'message'表中標識哪些消息是「* last *」? – eggyal

+1

message_id是自動增量,我嘗試使用ORDER BY m_id DESC,但它只適用於沒有GROUP BY的1行,我需要的是超過1行 – user2178521

回答

1
select * from (SELECT * FROM conversation_1 
LEFT JOIN conversation_2 
ON conversation_1.c_id = conversation_2.c_id  
LEFT JOIN user 
ON conversation_2.user_id = user.user_id  
LEFT JOIN message 
ON conversation_1.c_id = message.c_id  
WHERE conversation_1.user_id=1 
order by conversation_1.c_id desc) finalData 
GROUP BY message.c_id 
1

要注意的是,MySQL Extensions to GROUP BY下的記載:

MySQL的擴展使用GROUP BY使選擇列表可以引用未在GROUP BY子句中指定的非聚合列。這意味着前面的查詢在MySQL中是合法的。您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這對於每個組中未在GROUP BY中命名的每個非聚集列中的所有值都是相同的情況都很有用。服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY子句來影響。結果集的排序在選擇值後發生,並且ORDER BY不會影響服務器選擇的每個組中的哪些值。

這是在現有查詢中選擇消息(以及潛在的其他列)的情況。

相反,你想要的groupwise maximum

SELECT messages.* FROM messages NATURAL JOIN (
    SELECT c_id, MAX(m_id) m_id FROM messages GROUP BY c_id 
) t 
相關問題