仅从所有发件人中提取1条消息

时间:2013-03-11 03:44:14

标签: mysql sql greatest-n-per-group

我正在构建一个消息传递系统,并且只需要将每个发件人的最后一条消息提取到指定的收件人。因此,如果3个人每人向收件人发送5条消息(共15条消息),我需要获得3个条目;来自每个发件人的最后一条消息。

这是我当前的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

我尝试在DESC之后将'MAX(1)'添加到SELECT以及'LIMIT = 1',但是,当然,这只返回了1条消息。

2 个答案:

答案 0 :(得分: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 = ?

如果这不能解决问题,请添加示例记录以及您的问题:)

答案 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