2013-01-23 67 views
7

我從數據庫中提取一些對話。它們按user_from列進行分組。使用GROUP BY獲取最新條目

截止目前,它輸出最舊的消息。我想讓它顯示最新的消息。

這樣做最簡單的方法是什麼?

SELECT * 
FROM (`mail`) 
JOIN `users` ON `users`.`id` = `mail`.`user_from` 
JOIN `users_info` ON `users_info`.`user_id` = `mail`.`user_from` 
WHERE `user_to` = '1' 
GROUP BY `user_from` 
ORDER BY `mail`.`date` desc 

郵件表

enter image description here

用戶表(片斷)

enter image description here

這是當前的工作代碼。該SecretAgent發送消息不是從機構郵件,它應該顯示而不是 enter image description here

+4

@xQbert爲什麼?,最新的消息是最大的日期 – Lamak

+0

推測郵件爲ID,爲什麼不通過'mail.id desc'命令?或者是從不同地方插入的電子郵件,並且較高的ID不需要最新的電子郵件? – SERPRO

+0

這不會做到這一點,它仍然選擇*最古老*一 –

回答

4

MySQL是不幸的是關於GROUP BY條款,除非你包括所有產生不可靠的結果的內容非常寬鬆列在GROUP BY。從來不建議在聯接查詢中使用SELECT *,但現在我們將保留這一點。你需要做的是執行一個子查詢連接,它按日期爲用戶獲取最新的消息,並與其餘列進行連接。

SELECT 
    /* Don't actually do this. Be explicit about columns and assign aliases where their names collide */ 
    users.*, 
    users_info.*, 
    mail.* 
FROM 
    `users` 
    JOIN `mail` ON `users`.`id` = `mail`.`user_from` 
    JOIN `users_info` ON `users_info`.`user_id` = `mail`.`user_from` 
    /* Joined subquery gets most recent message from each user */ 
    JOIN (
    SELECT user_from, MAX(date) AS date 
    FROM mail 
    WHERE user_to = '1' 
    GROUP BY user_from 
    /* Joined back to the main mail table on user_from and date */ 
) most_recent ON mail.user_from = most_recent.user_from AND mail.date = most_recent.date 
    WHERE `user_to` =  '1' 

編輯更新,以顯示所有最近的發送,而不是唯一的一個。

+0

這似乎在PHPMyAdmin中運行它時工作。現在我將深入探討CodeIgniter文檔,並瞭解如何使用Active Records完成這項工作。謝謝! :-) –

+0

+1 *不幸*。舉行派對慶祝10萬? – Kermit

+0

@njk只是希望保持活躍 - 我不再回答太多。一些似乎已經在10萬年「退休」。我也許3天后... –