1

试图重新创建一个类似于 Facebook 近来设置的私人消息系统。我遇到问题的部分是仅选择来自不同线程的最新消息,按时间戳排序。

这是迄今为止我能想到的最接近的查询。问题是收件箱应该只为每个线程返回一行,目前我的查询从同一个线程返回多行:

SELECT m.created_on, m.thread_id, m.message_id, m.created_by, m.body, u.first_name, u.last_name, u.thumb_img

FROM pms_messages AS m, pms_recips AS r, users AS u

WHERE r.uid =19

AND r.status

IN ('A', 'N'
)

AND r.thread_id = m.thread_id

AND (SELECT max(r.message_id)) = m.message_id 

AND m.created_by = u.uid

ORDER BY created_on DESC

这是我当前数据库设置的 img,如果它可以简化我的查询并完成工作,我愿意对我的表进行更改。再往下是对我的表格/收件箱规格的更详细说明。

在此处输入图像描述

更具体:

*任何两个用户之间的消息都发生在一个正在进行的线程上。任何 2 个用户之间的所有消息只是一个正在进行的对话(线程)的延续即使两个用户都删除了彼此之间的所有先前消息,任何未来的消息仍然会出现在同一个线程上。

*单个消息由 message_id 跟踪。

*每个线程在任何给定时间仅在收件箱中显示一次,并将显示该线程的最新消息。

*接收和发送的邮件将显示在同一个收件箱中,而不是收件箱和发件箱。

因此,如果我的用户 A 和我有一条消息我还没有从用户 B-20 分钟前阅读,我回复了用户 C 昨天 - 10 分钟前发送给我的一条消息,而来自用户 D 的另一条消息 - 2 分钟前我的收件箱应该看起来像这样:

带有用户 D 的线程 - 显示用户 D 发送给我的消息。


带有用户 C 的线程 - 显示我发送给用户 C 的消息


与用户 B 的线程 - 显示用户 B 发送给我的消息


*正在显示的线程将按从最近到最旧的顺序排序。

4

2 回答 2

1

JOIN带有以下内容的表格pms_messages

SELECT thread_id, MAX(Created_ON) AS NewestDate
FROM messages 
GROUP BY thread_id

然后它将删除所有消息,但最新消息具有MAX(Created_ON). 像这样:

SELECT 
  m.created_on, 
  m.thread_id, 
  m.message_id, 
  m.created_by, 
  m.body, 
  u.first_name, 
  u.last_name, 
  u.thumb_img
FROM pms_messages AS m
INNER JOIN
(
   SELECT thread_id, MAX(Created_ON) AS NewestDate
   FROM messages 
   GROUP BY thread_id
) AS m2  ON m.created_on = m2.Newestdate
        AND m.thread_id  = m2.thread_id
INNER JOIN pms_recips AS r ON r.thread_id  = m.thread_id
INNER JOIN users      AS u ON m.created_by = u.uid
WHERE r.uid =19
  AND r.status IN ('A', 'N')
ORDER BY created_on DESC;

更新 1

添加r.message_id = m.message_idJOIN两个表之间的条件pms_messagespms_recips。像这样:

SELECT 
  m.created_on, 
  m.thread_id, 
  m.message_id, 
  m.created_by, 
  m.body, 
  u.first_name, 
  u.last_name, 
  u.thumb_img
FROM pms_messages AS m
INNER JOIN
(
   SELECT thread_id, MAX(Created_ON) AS NewestDate
   FROM pms_messages
   GROUP BY thread_id
) AS m2  ON m.created_on = m2.Newestdate
        AND m.thread_id  = m2.thread_id
INNER JOIN pms_recips AS r  ON r.thread_id  = m.thread_id 
                           AND r.message_id = m.message_id
INNER JOIN users      AS u  ON m.created_by = u.uid
WHERE r.uid =19
  AND r.status IN ('A', 'N')
ORDER BY created_on DESC;

SQL 小提琴演示

于 2013-02-24T06:06:19.280 回答
0
    SELECT * FROM 
        (SELECT * FROM messages ORDER BY created_at DESC) messages
    GROUP BY IF(from_user_id < to_user_id, CONCAT_WS('_', from_user_id, to_user_id), CONCAT_WS('_', to_user_id, from_user_id));
于 2016-03-11T14:41:46.580 回答