我必须在表中找到同一组的最大id行并显示roe细节。使用以下两种方法我们可以实现它。但是想知道哪种方法可以用于大数据。或者其他任何新方法都需要花费更少的时间来执行?感谢先进。
方法1:
select a.* from tab1 a left join (SELECT max(id) as id,name from tab1
GROUP by name) as tab2 on a.id=tab2.id where a.id=tab2.id
方法2:
SELECT id,name from tab1 where id in(SELECT MAX(id) FROM tab1 GROUP by name)
答案 0 :(得分:0)
取自手册(13.2.10.11将子查询重写为连接):
LEFT JOIN可能比子查询更快,因为 服务器可能能够更好地优化它。
因此子查询可能比LEFT [OUTER] JOINS慢,但在我看来,它们的强度略高于可读性。但由于第一种方法中有一个LEFT JOIN和一个子查询,第二种方法在大规模查询时可能会更快。
答案 1 :(得分:0)
您还可以使用窗口函数来避免自联接:
SELECT id, name
FROM (
SELECT
id,
name,
RANK() OVER(PARTITION BY name ORDER BY Id DESC) AS IdRankPerGroup
FROM tab1
) src
WHERE IdRankPerGroup = 1
RANK()函数按照" name"命令每行。分组并根据" id"分配排名。每组内的价值。然后在外部查询中,您只需获得排名= 1的行。
尝试所有三个查询,查看EXPLAIN计划,看看哪一个最适合大量数据。