我有一个由几个外部用户写的SQL表。每个用户都有自己的ID,并且一次只记录一条消息。该表中的每一行都有一个名为message_id的自动增量字段。换句话说,表中的每一行都有自己的唯一标识符。因此,如果要通过message_id列对表进行排序,他将按时间顺序排列所有消息。
是否有一条SQL命令可以返回每个用户记录的最新消息?
我可以分两步完成:
对于每个user_id:
SELECT *
FROM myTABLE AS T WHERE T.user_id=user_id
ORDER BY message_id DESC
LIMIT 1
但我认为有更好的方法。
由于
答案 0 :(得分:0)
一种方法是join
或where
条件:
select t.*
from mytable t
where t.id = (select max(t2.id) from mytable t2 where t2.user_id = t.user_id);
为获得最佳效果,您需要mytable(user_id, id)
上的索引。
如果没有这样的索引,最好使用明确的join
:
select t.*
from mytable t join
(select max(id) as maxid
from mytable t2
group by user_id
) tt
on t.id = tt.maxid;
答案 1 :(得分:0)
如果我正确理解了您的问题,那么您正在尝试执行单个查询,该查询将为每个user_id
获取有限数量的结果。我发现这个问题可能会有所帮助。
Using LIMIT within GROUP BY to get N results per group?
编辑:在研究了这一点之后,似乎在MySQL中实现这是一件复杂的事情。除非你正在努力寻找提高性能的方法,否则我认为你可以通过一个循环来查询你需要数据的每个用户的表。当然,这取决于您拥有多少数据以及有多少用户。