2010-11-08 57 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 
相關問題