use*_*605 1 mysql sql join self-join
我有一个看起来像这样的表:
Table: id, name
Run Code Online (Sandbox Code Playgroud)
名称可以多次显示.我正在尝试找出一个最佳查询,它将返回每个名称,即其最高ID.
输入数据:
1, "a"
2, "a"
3, "b"
4, "a"
5", "b"
Run Code Online (Sandbox Code Playgroud)
输出:
4, "a"
5, "b"
Run Code Online (Sandbox Code Playgroud)
我知道使用查询的FROM部分中的子查询来执行此操作的方法.我希望我能以某种方式做得更快.
我目前这样做:
SELECT table.*
FROM table, (SELECT MAX(id) maxid FROM table GROUP BY name) maxids
WHERE table.id = maxids.maxid
Run Code Online (Sandbox Code Playgroud)
我很想知道是否有更快的方法!
为什么使用自联接,这应该工作得很好:
select max(id), name
from yourtable
group by name
Run Code Online (Sandbox Code Playgroud)
现在,如果您想要在最终结果中包含更多列,则可以使用以下内容:
select t1.id, t1.name, t1.col1
from yourtable t1
inner join
(
select max(id) id, name
from yourtable
group by name
) t2
on t1.id = t2.id
and t1.name = t1.name
Run Code Online (Sandbox Code Playgroud)
甚至:
select t1.id, t1.name, t1.col1
from yourtable t1
where t1.id in (select max(t2.id)
from yourtable t2
group by t2.name);
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo of both