2013-03-11 23 views
0

我正在構建郵件系統,並且只需要將每個發件人的最後一封郵件提取到指定的收件人。所以,如果3個人每個發送5條消息(總共15條消息)給收件人,我需要得到3個條目;每個發件人的最後一條消息。從所有發件人僅提取1封郵件

這裏是我當前的SQL:

SELECT 
         messages.*, 
         user_accounts.uacc_id, 
         user_accounts.uacc_username, 
         user_profiles.upro_image_name 
        FROM messages 
         LEFT JOIN user_accounts 
          ON messages.msg_from_uacc_fk = user_accounts.uacc_id 
         LEFT JOIN user_profiles 
          ON user_profiles.upro_uacc_fk = user_accounts.uacc_id 
        WHERE 
         messages.msg_to_uacc_fk = ? 
        ORDER BY 
         msg_id 
        DESC 

我嘗試添加 'MAX(1)' 的SELECT以及 'LIMIT = 1' 的DESC後,但是,當然,這只是返回共有1條消息。

回答

1

你不能簡單地使用一組?

SELECT u.uacc_username, max(m.msg_id) as LatestMsg 
FROM messages m JOIN user_accounts u on m.msg_from_uacc_fk = u.uacc_id 
WHERE m.msg_to_uacc_fk = ? 
GROUP BY u.uacc_username 
+0

你好一起,幾乎工程。它現在只能得到一條消息。但是,它沒有得到最後的消息。我應該用LatestMsg做些什麼嗎? – 2013-03-11 04:13:26

2

有時很難猜測表的設計方式,但下面的查詢使用子查詢爲每個用戶獲取最新消息。

SELECT a.*, 
     c.uacc_id, 
     c.uacc_username, 
     d.upro_image_name 
FROM messages a 
     INNER JOIN 
     (
      SELECT msg_from_uacc_fk, MAX(msg_id) max_id 
      FROM messages 
      GROUP BY msg_from_uacc_fk 
     ) b ON a.msg_from_uacc_fk = b.msg_from_uacc_fk AND 
       a.msg_id = b.max_id 
     INNER JOIN user_accounts c 
      ON a.msg_from_uacc_fk = c.uacc_id 
     INNER JOIN user_profiles d 
      ON d.upro_uacc_fk = c.uacc_id 
WHERE a.msg_to_uacc_fk = ? 

如果這不能解決問題,請加樣本記錄你的問題:)

+0

謝謝JW。感謝John Bingham的回答,我只是測試了一個幾乎與此相同的解決方案。 – 2013-03-11 05:22:33

+0

哦,順便說一句,解決方案在看到你的差異後確實奏效。對不起,我不能接受2個答案。 – 2013-03-11 05:23:39

+0

是的,你是對的。然而,約翰給出的答案是50%正確的,並引導我走向與您的解決方案几乎完全相同的解決方案。所以我覺得他有權投票。有時很難知道,如果有多個人提供了可以提供工作解決方案的投入,誰的投票答案就可以投票。 – 2013-03-11 05:31:52

相關問題