3

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

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是返回的行。

有没有办法在不使用子查询的情况下做到这一点?在关系代数用语中,这个过程是否有一个名称?

4

2 回答 2

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上查看。

于 2013-06-11T00:53:59.470 回答
2

您可以通过 user_id 获取最大值和组:

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

在此处查看工作演示

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

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

于 2013-06-11T01:15:44.627 回答