在MySQL中选择每个结果中的最新一个

时间:2014-03-01 03:33:46

标签: mysql sql aggregate-functions greatest-n-per-group

假设我有一个类似于此的表,但包含更多列和更多行(这些是唯一相关的):

+-------+----+
| name  | id |
+-------+----+
| james | 1  |
| james | 2  |
| james | 3  |
| adam  | 4  |
| max   | 5  |
| adam  | 6  |
| max   | 7  |
| adam  | 8  |
+-------+----+

我怎样才能得到它,以便它只显示每个max(id)中的name,如:

+-------+----+
| name  | id |
+-------+----+
| adam  | 8  |
| max   | 7  |
| james | 3  |
+-------+----+

我目前只有这个

"select * from table order by id desc"

但这只是显示最新的ID。我只希望能够看到每个名字中的一个。


所以基本上只显示每个id

的最高name

2 个答案:

答案 0 :(得分:3)

您将使用聚合和max()

select name, max(id)
from table t
group by name
order by max(id) desc
limit 40;

编辑:

如果您需要具有最高select *的{​​{1}},请使用id方法:

not exists

“不存在”基本上说:“在表格中找到所有没有其他行具有相同名称和更高ID的行”。这是获得最大行的圆形方式。

答案 1 :(得分:0)

实现这一目标的一种方法是利用MySQL中的非标准GROUP BY扩展名

SELECT *
  FROM
(
  SELECT *
    FROM table1
   ORDER BY id DESC
) q
 GROUP BY name
 -- LIMIT 40

或另一种方法是首先获取每个名称的最大ID,然后再加入到您的表中以获取所有其他列

SELECT t.*
  FROM
(
  SELECT MAX(id) id
    FROM table1
   GROUP BY name
   -- LIMIT 40
) q JOIN table1 t
    ON q.id = t.id
 ORDER BY name;

输出:

|  NAME | ID |
|-------|----|
|  adam |  8 |
| james |  3 |
|   max |  7 |

这是 SQLFiddle 演示