我有一个chat_hist表,其结构如下:
|chat_id (auto increment)|room_id(int)|sender_id(int)|messege(text)|timestamp|
那么,基于每个chat_room
中的最新room_id
(chat
)来列出timestamp
(chat_room
)的最佳方法(性能明智)是什么? (就像Whatsapp组上的列表一样)?
我之所以这样问,是因为我不是数据库专家,并且我想每个房间中的聊天消息都会随着每个用户刷新最新列表而产生怎样的效果
我现在使用的是这个
select room_id from (
select room_id,max(time_stamp) as ts from chat_hist where room_id in (
select distinct room_id from chat_room
)
group by room_id
) as A order by ts desc
表chat_room
是所有room_id
所在的位置。
那么最好的方法是什么...
提前谢谢
答案 0 :(得分:1)
您的chat_id自动递增。因此大概随着时间戳的增加而增加。
因此,您可以在chat_hist中找到每个room_id的最新行,就像这样
SELECT room_id, MAX(chat_id) chat_id
FROM chat_hist
GROUP BY room_id
如果您在room_id
上有一个索引,则此子查询将非常快。它使用所谓的松散索引扫描。
然后,您可以将其用作子查询以获取每个房间的最新聊天详细信息:
SELECT c.*
FROM chat_hist c
JOIN (
SELECT room_id, MAX(chat_id) chat_id
FROM chat_hist
GROUP BY room_id
) latest ON c.chat_id = latest.chat_id