如何根据MySQL中的条件对记录进行分组(group_by)

时间:2011-08-11 06:29:54

标签: mysql greatest-n-per-group

我有用户表,每个用户都有多条记录。我需要获取每个用户的最新插入记录。如何使用MySQL

用户表

id      name   value    updated_at

1       abc    123      2011-02-03
2       xyz    qwe      2011-04-03
3       abc    asd      2011-08-08
4       xyz    poi      2011-08-07

我的输出应该是

id      name   value    updated_at

3       abc    asd      2011-08-08
4       xyz    poi      2011-08-07

我使用了像

这样的查询
 select id,name,value,updated_at  from users group by name having max(updated_at)

 select id,ep_name,position,max(updated_at)  from test1 group by ep_name having max(updated_at)

但我无法获得理想的结果。我得到max(updated_at)值但无法获得匹配的行。请帮忙

注意:这可以在不使用子查询的情况下完成。请帮忙

提前致谢

3 个答案:

答案 0 :(得分:2)

SELECT
  users.id,users.name, users.`value`, users.`updated_at`
FROM
  users
INNER JOIN
(
 SELECT name, MAX(updated_at) AS `updated_at`
 FROM
  users
 GROUP BY
  name
) max_users
ON
  users.name = max_users.name
AND
  users.updated_at = max_users.updated_at

Dan非常感谢... :)组中的小变化以匹配我的输出

答案 1 :(得分:1)

不,没有子查询就无法做到这一点。子查询是单个查询的一部分。

SELECT
  users.*
FROM
  users
INNER JOIN
  (
    SELECT
      id,
      MAX(updated_at) AS `updated_at`
    FROM
      users
    GROUP BY
      id
  ) max_users
ON
  users.id = max_users.id
AND
  users.updated_at = max_users.updated_at

答案 2 :(得分:0)

你是对的Amal先生你不会得到你上面指定的答案.Dan将会返回所有结果。

一定要试试这个你将会在途中

SELECT  test.* FROM  test INNER JOIN (SELECT MAX(updated_at) AS `updated_at` FROM test GROUP BY  name) max_users
ON
  test.updated_at = max_users.updated_at

第二个选项:

SELECT  * FROM  test WHERE updated_at IN(SELECT MAX(updated_at) FROM test GROUP BY  name)

比第一个简单得多