在Postgres中将变量作为WHERE传递

时间:2015-07-22 18:37:30

标签: postgresql

在Postgres中,我有代表玩家的数据。我有一个视图,其中包含每个玩家的排名(以分数计),他们的名字,他们的分数和唯一ID。我需要一个声明,返回以下内容:

  • 为一群球员返回前三名得分
  • 将三个分数返回到当前玩家
  • 之上
  • 返回当前玩家的得分
  • 返回当前玩家
  • 以下的三个分数

我可以这样做:

  (SELECT rank, score, name, id FROM base_lederboard
    ORDER BY rank DESC LIMIT 3)
UNION
  (SELECT rank, score, name, id FROM base_lederboard
    WHERE rank BETWEEN
       (SELECT rank FROM base_lederboard WHERE id = '123466') - 3
    AND
       (SELECT rank FROM base_lederboard WHERE id = '123466') + 3)
ORDER BY rank ASC;

现在问题出现了:我需要为任何id值执行此操作。但我需要传递值的方式是WHERE语句。这主要是因为其他服务将使用PostgREST调用数据。

基本上我需要将其称为:

SELECT * FROM the_solution WHERE id = 'the_given_id';

所以我认为我需要的是:一个新视图,列出所有分数,并为每个分数加入以前的数据。然后,一次只为这个新表调用一个值,因此获得任何给定播放器的上述查询。但是,即使经过几个小时的尝试,我也无法做到。

我尝试创建Postgres规则,我尝试了INSTEAD OF视图(他们不会处理SELECT语句),我尝试了很多东西。

我试图做错了吗?如果是这样,我该怎么办?

最简单的解决方案是让使用该服务的人员进行多个查询。但这似乎是非常错误的。或者使用外部语言为我组装查询,但这似乎更加错误。当然Postgres必须提供一种方法来实现这一目标。

1 个答案:

答案 0 :(得分:0)

好吧,我在那里途中:

SELECT
    bl.id AS input, scores.rank, scores.score, scores.name, scores.id
  FROM base_lederboard AS bl
    RIGHT JOIN base_lederboard AS scores ON (
      scores.rank BETWEEN
        (SELECT rank FROM base_lederboard AS tbl WHERE bl.id = tbl.id LIMIT 1) - 3
      AND
        (SELECT rank FROM base_lederboard AS tbl WHERE bl.id = tbl.id LIMIT 1) + 3)
  ORDER BY bl.rank, scores.rank ASC;

这将返回所选用户的分数及其周围分数。但最高分仍然需要单独查询。

- 编辑 -

从这一点来看,实际上非常简单:

SELECT
    bl.id AS input, scores.rank, scores.score, scores.name, scores.id
  FROM base_lederboard AS bl
    RIGHT JOIN base_lederboard AS scores ON (
      scores.rank BETWEEN 1 AND 3 OR
      scores.rank BETWEEN
        (SELECT rank FROM base_lederboard AS tbl WHERE bl.id = tbl.id LIMIT 1) - 3
      AND
        (SELECT rank FROM base_lederboard AS tbl WHERE bl.id = tbl.id LIMIT 1) + 3)
  ORDER BY bl.rank, scores.rank ASC;

这就是一切!