假设我有一个类似于此的表,但包含更多列和更多行(这些是唯一相关的):
+-------+----+
| 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
答案 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 演示