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