我有一个有趣的问题要问你:) 假设: 我在Postgres数据库上使用Spring和Hibernate。
我有用户表,每个用户都有它的名字和它的分数。 我希望生成一种排名:给定用户的名称我推断出5个用户得分高于给定用户的用户和5个得分低于此用户的用户:
我的问题是:是否可以仅在一个查询中创建它?在一个查询中它会更优化和更快吗?你对此类查询有什么建议吗? 在两个查询中执行它非常简单,但我想知道是否有一种方法可以一次完成它?
答案 0 :(得分:2)
PostgreSQL可以通过单个查询来实现。您可能需要在Hibernate中使用本机(原始)SQL。这是一种方式。
with lowers as (
select *
from test
where score < (select score from test where user_id = 13)
limit 5
), highers as (
select *
from test
where score > (select score from test where user_id = 13)
limit 5
)
select * from lowers
union all
select * from highers
union all
select * from test where user_id = 13
order by score;
如果没有五个分数比目标(user_id = 13)小五个分数,你应该考虑会发生什么。此外,此查询不会引入任何与目标成绩相同的行,这些行可能是您正在寻找的,也可能不是。它也不会尝试将最接近的10行添加到目标。
在我的开发箱上,这不是speedster,这个查询在一百万行的表上运行0.1毫秒。