【问题标题】:How to select ten values, five larger and five smaller than a given value in one Postgre query?如何在一个 Postgre 查询中选择十个值,五个大于给定值,五个小于给定值?
【发布时间】:2015-01-22 18:03:34
【问题描述】:

我有一个有趣的问题要问你:) 假设: 我在 Postgres 数据库上使用 Spring 和 Hibernate。

我有用户表,每个用户都有它的名字和分数。 我想生成一种排名,其中:给定用户的名称,我推断出 5 个得分比给定用户更高的用户和 5 个得分更低的用户,如下所示:

  • user1 第 105 页
  • user2 第 104 页
  • user3 第 103 页
  • user4 第 102 页
  • 给定用户第 100 页
  • user6 第 99 页
  • user7 第 98 页
  • ...

我的问题是:是否可以仅在一个查询中完成?它会在一个查询中更优化、更快吗?您对这样的查询有什么建议吗? 在两个查询中执行此操作非常简单,但我想知道是否有办法一次性完成?

【问题讨论】:

  • UNION使用你的2个查询
  • 据我所知,hibernate dosent 支持联合查询。 link

标签: sql hibernate postgresql


【解决方案1】:

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 行。

在我的开发机器上,它不是速度器,这个查询在 0.1 毫秒内运行在一百万行的表上。

【讨论】:

  • 嗨,迈克,非常感谢您的提示,我不知道“与”关闭,所以我必须研究它。我还必须考虑您提到的所有问题,以便我们看到。如果我最终得到合理的结果,我会告诉你的:)
猜你喜欢
  • 2020-03-25
  • 2013-10-27
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 2021-10-20
  • 2018-01-26
  • 1970-01-01
  • 2015-02-03
相关资源
最近更新 更多