在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必须提供一种方法来实现这一目标。
答案 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;
这就是一切!