检索每个用户的最新条目

时间:2013-06-11 00:45:06

标签: mysql sql

如果我有一个包含以下结构和数据的表:

id | user_id | created_at
-------------------------
 1 |       7 |    0091942
 2 |       3 |    0000014
 3 |       6 |    0000890
 4 |       6 |    0029249
 5 |       7 |    0000049
 6 |       3 |    0005440
 7 |       9 |    0010108

我将使用什么查询来获得以下结果(以下说明):

id | user_id | created_at
-------------------------
 1 |       7 |    0091942
 6 |       3 |    0005440
 4 |       6 |    0029249
 7 |       9 |    0010108

如你所见:

  • 每个user_id只返回一行。
  • 具有最高created_at的行是返回的行。

有没有办法在不使用子查询的情况下完成?相关代数说法中有一个名称,这个程序是通过吗?

2 个答案:

答案 0 :(得分:6)

该查询称为groupwise maximum,(在MySQL中,至少)可以使用子查询实现。例如:

SELECT my_table.* FROM my_table NATURAL JOIN (
  SELECT   user_id, MAX(created_at) created_at
  FROM     my_table
  GROUP BY user_id
) t

sqlfiddle上查看。

答案 1 :(得分:2)

您可以通过user_id获取max和group:

select id,user_id,max(created_at)
from supportContacts
group by user_id
order by id;

以下是它的输出:

ID  USER_ID MAX(CREATED_AT)
1   7   91942
2   3   5440
3   6   29249
7   9   10108

查看工作demo here

请注意,小提琴上的示例使用created_at字段作为int,只使用您的格式,它应该没有区别。

编辑:我会将此答案作为参考,但请注意,他的查询会产生不希望的结果,正如戈登所说,请不要在生产中使用它。