Внутреннее объединение в одну строку, получая только самую высокую строку - PullRequest
2 голосов
/ 08 ноября 2010

Когда я присоединяюсь ко второй таблице, я хочу присоединиться только к одной строке. Критерием является выбор строки с наибольшим целым числом в столбце уровня. Я думал что-то вроде этого:

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

Для каждой строки в file_repo я получу одну строку из файлов с самым высоким значением в столбце уровня.

Ответы [ 2 ]

5 голосов
/ 08 ноября 2010
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.

5 голосов
/ 08 ноября 2010
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 
...