查找符合条件的唯一列

时间:2016-03-02 21:53:44

标签: mysql sql

我有一个由几个外部用户写的SQL表。每个用户都有自己的ID,并且一次只记录一条消息。该表中的每一行都有一个名为message_id的自动增量字段。换句话说,表中的每一行都有自己的唯一标识符。因此,如果要通过message_id列对表进行排序,他将按时间顺序排列所有消息。

是否有一条SQL命令可以返回每个用户记录的最新消息?

我可以分两步完成:

  1. 获取user_ids列表。
  2. 对于每个user_id:

    SELECT * 
    FROM myTABLE AS T WHERE T.user_id=user_id 
    ORDER BY message_id DESC 
    LIMIT 1
    
  3. 但我认为有更好的方法。

    由于

2 个答案:

答案 0 :(得分:0)

一种方法是joinwhere条件:

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中实现这是一件复杂的事情。除非你正在努力寻找提高性能的方法,否则我认为你可以通过一个循环来查询你需要数据的每个用户的表。当然,这取决于您拥有多少数据以及有多少用户。