Sim*_*ner 5 mysql sql greatest-n-per-group
我已经看到了很多关于这类问题的解决方案(特别是这一个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 |
+------+--------------+----------+----------------+---------------+
Run Code Online (Sandbox Code Playgroud)
输出应该是最大版本号,按group_id和entity_id分组,如果有帮助,我只需要单个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 |
+------+--------------+----------+----------------+---------------+
Run Code Online (Sandbox Code Playgroud)
我想出的是这个自我加入:
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
Run Code Online (Sandbox Code Playgroud)
但是这个只有在不同的实体不共享相同的组号时才有效.不幸的是,这是必要的.
我在创建视图时遇到了一个有效的解决方案,但在我当前的设置中不支持此功能.
任何想法都受到高度赞赏.谢谢!
尝试这个:
select t1.* from attachments t1
left join attachments t2
on t1.entity_id = t2.entity_id and t1.group_id = t2.group_id and
t1.version_number < t2.version_number
where t2.version_number is null
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3038 次 |
| 最近记录: |