Postgres Sql如何获得具有正确序列的排名顺序

时间:2019-01-03 05:12:28

标签: sql postgresql postgresql-9.4

我有2个表个人资料圆圈。个人资料表中有一列称为 points 。我正在尝试进行排名,从本质上讲,是要吸引您关注的所有人员,并根据要点从上到下对其进行排名。那是可行的,我的问题是我也想将从事以下工作的实际人员包括在内。这些我桌子上的图片应该弄清楚

圈子表具有my_id的人关注other_id enter image description here

个人资料表 enter image description here

我的ID在下面是57,而我的查询在我下面是59,输出是14,因为这是用户ID 59的得分。我还想在下面的查询中加入自己的记录,以便可以看到我在跟随的人旁边的排名。查询应该返回14和3而不是现在的14。任何建议都会很棒。

   Select p.points from profiles p
     join circles c on p.ID = c.other_id
     where c.my_id=57 order by p.points desc

2 个答案:

答案 0 :(得分:1)

我们可以尝试在CTE中引入计算列,以跟踪给定用户是否对应于进行排名的用户。然后,从该CTE中选择并使用计算列进行排序。

WITH cte AS (
    SELECT p.ID, p.points,
        CASE WHEN c.my_id = 57 THEN 0 ELSE 1 END AS position
    FROM profiles p
    INNER JOIN circles c
        ON p.ID = c.other_id
)

SELECT ID, points
FROM cte
ORDER BY position, points DESC;

一种极端情况是,执行排名的用户不会出现在下面的列表中。如果您实际上希望排名用户同时出现在列表和顶部,那么您将必须使用联合:

SELECT p.ID, p.points, 0 AS position
FROM profiles p
INNER JOIN circles c
    ON p.ID = c.other_id
WHERE c.my_id = 57
UNION ALL
SELECT p.ID, p.points, 1
FROM profiles p
INNER JOIN circles c
    ON p.ID = c.other_id
ORDER BY
    3, 2 DESC;

答案 1 :(得分:0)

如果我理解正确,可能是类似

select (select points from profiles where id = c.my_id ) my_points, 
  (select points from profiles where id = c.other_id) other_points
from circles c
where my_id = 57
order by 1 desc,2 desc

注意:
1)假设在给定条件下圆圈的线数相对较少。如果不是这种情况,最好通过加入配置文件表来添加信息
2)我以为您希望获得other_id的积分,而不是排名