2014-03-29 85 views
0

我有以下問題。我有兩個表:SQL:從另一個表中選擇對話GROUP BY與最後一條記錄

baz_conversations

con_id, con_users, con_date 

baz_con_messages

message_id, message_con_id, message_text, message_author 

而且我想告訴我的所有談話 - con_users表baz_conversations必須包括身份識別碼與最後一條消息那次談話的另一張桌子。我花了太多的時間編程這個簡單的sql選擇,但它從表baz_con_messages中選擇FIRST和NOT LAST消息。謝謝您的回答。這裏是我的代碼:

SELECT m.*, c.* FROM baz_conversations AS c RIGHT JOIN 
        baz_con_messages AS m ON c.con_id = m.message_con_id 
WHERE c.con_users LIKE '%1,%' 
GROUP BY c.con_id 
ORDER BY m.message_id DESC 
LIMIT 1 
+3

您正在使用什麼數據庫SQL服務器還是MySQL?你應該只用你真正使用的數據庫來標記你的問題。從使用'limit',我會猜測MySQL。 –

回答

0

我想你想是這樣的:

SELECT m.*, c.* 
FROM baz_conversations c JOIN 
    baz_con_messages m 
    ON c.con_id = m.message_con_id 
WHERE c.con_users LIKE '%1,%' AND 
     not exists (select 1 
        from baz_con_messages m2 
        where m2.message_con_id = m.message_con_id and 
         m2.message_id > m.message_id 
       ); 
0

通過自我嘗試這個連接,當你通過你的結果進行分組,但不是在一些共同的價值觀使用GROUP BY有序的方式,所以你不能指望使用組,因爲它會給你一個組的最新結果,所以對於你的情況,你需要從對話組中的最後一個消息ID我使用另一個加入baz_conversations作爲自我加入,但這次我使用子查詢以獲得消息ID的最大值以及對話ID並加入兩個條件,即USING(message_id , message_con_id)所以第一baz_con_messages被加入了與新的最大結果集,其中的對話id是常見的,還兼有,與結果消息的ID相匹配,以便將結果根據MAX(message_id)每個會話組只有一個返回

SELECT 
    m.*, 
    c.* 
FROM 
    baz_conversations AS c 
    JOIN baz_con_messages AS m 
    ON c.con_id = m.message_con_id 
    JOIN 
    (SELECT MAX(message_id) message_id , message_con_id 
    FROM baz_con_messages GROUP BY message_con_id 
    ) m2 
    USING(message_id , message_con_id) 
WHERE c.con_users LIKE '%1,%' 
ORDER BY m.message_id DESC 
+0

謝謝。你是對的。它的作品,但你能告訴我更多關於你的答案。我不明白你的SQL查詢:/請,如果你可以描述你的查詢的個別部分,我會很高興。再次感謝。 – user3354689

+0

@ user3354689看到我更新的答案,希望它是有道理的 –

相關問題