Я видел довольно много решений для такого рода проблем (особенно эта SQL Выбирать только строки с максимальным значением в столбце ) , но ни один из них не кажется подходящим:
У меня есть следующий макет таблицы, версия вложений, привязанных к сущностям:
TABLE attachments
+------+--------------+----------+----------------+---------------+
| id | entitiy_id | group_id | version_number | filename |
+------+--------------+----------+----------------+---------------+
| 1 | 1 | 1 | 1 | file1-1.pdf |
| 2 | 1 | 1 | 2 | file1-2.pdf |
| 3 | 1 | 2 | 1 | file2-1.pdf |
| 4 | 2 | 1 | 1 | file1-1.pdf |
| 5 | 2 | 1 | 2 | file1-2.pdf |
| 6 | 2 | 3 | 1 | file3-1.pdf |
+------+--------------+----------+----------------+---------------+
Вывод должен быть максимальным номером версии, сгруппированным по group_id и entity_id, я бы нужен только список для single entity_ids, если это помогает:
+------+--------------+----------+----------------+---------------+
| id | entitiy_id | group_id | version_number | filename |
+------+--------------+----------+----------------+---------------+
| 2 | 1 | 1 | 2 | file1-2.pdf |
| 3 | 1 | 2 | 1 | file2-1.pdf |
| 5 | 2 | 1 | 2 | file1-2.pdf |
| 6 | 2 | 3 | 1 | file3-1.pdf |
+------+--------------+----------+----------------+---------------+
То, что я придумал, - это один self join:
SELECT *
FROM `attachments` `attachments`
LEFT OUTER JOIN attachments t2
ON ( attachments.group_id = t2.group_id
AND attachments.version_number < t2.version_number )
WHERE ( t2.group_id IS NULL )
AND ( `t2`.`id` = 1 )
GROUP BY t2.group_id
Но этот работает только в том случае, если разные объекты не имеют одинаковых номеров групп. Это, к сожалению, необходимо.
При создании представления я нашел рабочее решение, но оно не поддерживается в моих текущих настройках.
Любые идеи приветствуются. Спасибо!