我正在制作一个类似于facebook的消息传递系统。
我有两个表:
messages =>
m_id (message id)
t_id (thread id)
author_id (id of user that wrote the message)
text (Text for the message)
date (date)
time (time)
thread_recipients =>
t_id (thread_id)
user_id (id of the user that will belong to this thread)
read (Flag to tell if there are any unread messages)
所以我基本上想要的是得到一个用户所在的线程(对话)的列表。在该列表中,我想选择的文本,日期和时间的最后一条消息是张贴在线程。
我做了一个sqlfiddle:http://sqlfiddle.com/!2/a3d9b/2
所以基本上我希望这个查询只返回最后一行,因为它有最高的消息id。
如果不需要子查询就可以完成,那就太好了。如果没有,那我只能忍受了(:
编辑:我想出了如何用子查询来实现它。但我最关心的是性能。如果可能的话,我很想用另一种方式来做。
SELECT r.t_id, m.author_id, left(m.text, 50)
FROM
messages m,
thread_recipients r
WHERE
r.user_id = 16 and
r.t_id = m.t_id and
m.m_id = (SELECT MAX(mm.m_id) FROM messages mm WHERE mm.t_id = m.t_id)
看看这个:http://www.techonthenet.com/sql/max.php我想这就是你需要的。
试试这个
SELECT r.t_id, m.author_id, left(m.text, 50)
FROM messages m, thread_recipients r
WHERE
r.user_id = 16 and r.t_id = m.t_id
GROUP BY m.m_id
ORDER BY m.m_id DESC
LIMIT 1
我更新你的 sqlfiddle