2010-11-08 28 views
2

当我内部连接第二个表时,我只想连接一行。条件是采取级别列中具有最高整数的行。我想是这样的:通过仅获得最高整数行内部连接单行

SELECT * 
FROM file_repo 
INNER JOIN 
( SELECT 
     MAX(files.level) 
    FROM 
     files 
) ON file_repo.id = files.repo_id 

对于每一行file_repo我会得到一个单列的文件,在水平列中的最高值。

回答

5
SELECT * 
FROM file_repo fr 
JOIN files f 
ON  f.id = 
     (
     SELECT id 
     FROM files fi 
     WHERE fi.repo_id = fr.id 
     ORDER BY 
       repo_id DESC, level DESC, id DESC 
     LIMIT 1 
     ) 

此创建于files (repo_id, level, id)的索引快速地工作。

这将正确处理level上的重复项。

+0

与其他人(10x左右)相比,此解决方案似乎运行得相当缓慢。在另一个例子中,两个file_repo共享同一级别时发生了什么问题?这只是匹配文件的不一致选择吗? – 2011-09-08 17:11:29

+0

@ebyrob:你将得到所有最新的文件,而不是一个。请注意,性能取决于表的索引方式,如果您有大量空回购(其中完全没有文件),则其他解决方案的确可以更快。 – Quassnoi 2011-09-08 17:31:51

5
SELECT fr.*, fm.MaxLevel 
FROM file_repo fr 
INNER JOIN ( 
    SELECT repo_id, MAX(level) as MaxLevel 
    FROM files 
    GROUP BY repo_id 
) fm ON fr.id = fm.repo_id 
相关问题