想请教一个关于如何构造一个 top 50的问题
表1
name root type .... file1 1 json file2 2 zip file3 1 zip file4 8 zip file4 1 tar ..........
表2
repo root repo1 1 repo2 2 ........
我现在想构造一个 query,这个query 可以返回 表1 拥有file 最多的 top 50个 root 以及每个root所对应的file的数量是多少 和 root对应的 repo的名字是什么。
我自己的实现方法是,先把所有的dinstinct的 root id 存到一个表里, 然后用那个root id 去query file的表 去看每个 root id 都存了多少的files数量,最后再排序。
但是这个方法不是特别的好,感觉效率比较低,并且需要我在服务层去重复ping database。因为对 postgres不是很熟悉,所有想问问大佬谁能够给小弟点拨一番。
我试着写一下SQL,PostgreSQL支持很丰富的SQL特性,应只需要一次数据库查询
select A.root, B.repo, A.filenum from ( select root, count() as filenum from 表1 group by root order by count() desc limit 50 ) A left join 表2 on A.root=B.root order by A.filenum desc
注意,如你的表1的root与表2的root不是外键关联的话,有可能有些root在表1有用了,但从表2查不出名字,此时结果中名字会显示为null。。。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。