2014-03-29 43 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看到我更新的答案,希望它是有道理的 –

相关问题