Postgres Sql Как получить этот порядок ранжирования с правильной последовательностью - PullRequest
0 голосов
/ 03 января 2019

У меня есть 2 таблицы Профили и Круги . В таблице профилей есть столбец с именем points . Я пытаюсь сделать рейтинг, по сути, собрать всех людей, за которыми вы подписаны, и расставить их сверху вниз в соответствии с баллами. Это работает, моя проблема в том, что я также хочу включить в этот ранг настоящего человека, который делает следующее. Эти фотографии моих таблиц должны уточнить

Таблица кругов Человек с my_id следует за other_id enter image description here

Таблица профилей enter image description here

Мой идентификатор 57 ниже, и я следую 59 с моим запросом ниже, результат равен 14, так как именно столько очков имеет пользовательский идентификатор 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 голосов
/ 03 января 2019

Если я правильно понимаю, это может быть что-то вроде

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, а не ранга

0 голосов
/ 03 января 2019

Мы можем попытаться ввести столбец вычислений в 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;
...