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