при реализации встроенной функции поиска для нашего локального файлового архива у меня возникла серьезная проблема, для которой я не нашел ответа. У нас есть две таблицы:
fild_id | file_name
---------------------
1 | this_file
2 | that_file
3 | new_file
file_archive_id | file_archive_version | file_id
--------------------------------------------------
1 | 1 | 1
2 | 2 | 1
3 | 1 | 2
4 | 1 | 3
5 | 3 | 1
Я хочу объединить обе таблицы с помощью file_id, выбрав только одну строку file_archive с наибольшим значением file_archive_version:
fild_id | file_name | file_archive_id | file_archive_version
--------------------------------------------------------------
1 | this_file | 5 | 3
2 | that_file | 3 | 1
3 | new_file | 4 | 1
Есть ли возможность сделать это с помощью одного оператора select?
Решение:
SELECT df.*,
(
SELECT dfa.file_archive_id
FROM dca_file_archive dfa
WHERE df.file_id = dfa.file_id
ORDER BY dfa.file_archive_version desc LIMIT 1
) as file_archive_id,
(
SELECT dfa.file_archive_version
FROM dca_file_archive dfa
WHERE df.file_id = dfa.file_id
ORDER BY dfa.file_archive_version desc LIMIT 1
) as file_archive_version
FROM dca_file df
Обе таблицы, имеющие ~ 16 тыс. Строк, для выполнения этого оператора требуется 0,9 секунды, что в 120 раз быстрее, чем первое решение для объединения.