Выберите строки с максимальным значением, сгруппированными по двум столбцам

Я видел довольно много решений для такого рода проблем (особенно эта 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

Но этот работает только в том случае, если разные объекты не имеют одинаковых номеров групп. Это, к сожалению, необходимо.

При создании представления я нашел рабочее решение, но оно не поддерживается в моих текущих настройках.

Любые идеи приветствуются. Спасибо!

5
задан Community 23 May 2017 в 11:50
поделиться