0

我正在构建一个消息传递系统,只需要从每个发件人那里提取最后一条消息给指定的收件人。因此,如果 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

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

4

2 回答 2

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 = ?

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

于 2013-03-11T05:11:13.323 回答
1

你不能简单地使用 group by 吗?

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
于 2013-03-11T03:57:39.573 回答