Реализация столбца сортировки в Postgres, который действует как связанный список

Скажем, у меня есть таблица базы данных teams, в которой есть столбец упорядочивания position, позиция может быть либо null, если это последний результат, либо идентификатором следующего team, который расположен на единицу выше, чем эта команда. Это приведет к созданию списка, который всегда строго отсортирован (если вы используете целые числа, вам нужно управлять всеми другими значениями позиций при вставке нового team, т.е. увеличивать их все на единицу), и вставка становится менее сложной ...

Но получить эту таблицу в виде отсортированного запроса оказалось непросто, вот где я сейчас нахожусь:

WITH RECURSIVE teams AS (  
  SELECT *, 1 as depth FROM team
  UNION
  SELECT t.*, ts.depth + 1 as depth
  FROM team t INNER JOIN teams ts ON ts.order = t.id 
SELECT
  id, order, depth
FROM
  teams
;

Это дает мне что-то вроде:

 id | order | depth
----+-------+-------
 53 |    55 |     1
 55 |    52 |     1
 55 |    52 |     2 
 52 |    54 |     2
 52 |    54 |     3
 54 |       |     3
 54 |       |     4

Какой вид отражает то, куда мне нужно добраться с точки зрения упорядочения (максимальная глубина представляет собой порядок, который я хочу ...), однако я не могу понять, как изменить запрос, чтобы получить что-то вроде:

 id | order | depth
----+-------+-------
 53 |    55 |     1
 55 |    52 |     2 
 52 |    54 |     3
 54 |       |     4

Однако, похоже, я меняю запрос, который он жалуется мне на применение GROUP BY как к id, так и к depth ... Как мне добраться из того места, где я сейчас, туда, где я хочу быть?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш рекурсивный запрос должен где-то начинаться (пока вы выбираете всю таблицу в первом подзапросе). Предлагаю начать с последней записи, в которой столбец order равен нулю, и перейти к первой записи:

with recursive team(id, ord) as (values(53,55),(55,52),(52,54),(54,null)),
  teams as (
    select *, 1 as depth from team where ord is null -- select the last record here
    union all
    select t.*, ts.depth + 1 as depth
    from team t join teams ts on ts.id = t.ord) -- note that the JOIN condition reversed comparing to the original query
select * from teams order by depth desc; -- finally reverse the order
┌────┬──────┬───────┐
│ id │ ord  │ depth │
├────┼──────┼───────┤
│ 53 │   55 │     4 │
│ 55 │   52 │     3 │
│ 52 │   54 │     2 │
│ 54 │ ░░░░ │     1 │
└────┴──────┴───────┘
border 2, linestyle unicode и null дают что-то похожее, но все же с вертикальным | вместо линии - как вы рисуете свою таблицу? .. Я знаю, что это не связано, но, пожалуйста - поделитесь
Vao Tsun 02.05.2018 10:13

@VaoTsun Вот содержимое моего .psqlrc: pastebin.com/9MEipXCz и как он выглядит: i2.imageban.ru/out/2018/05/02/… Надеюсь, это будет полезно.

Abelisto 02.05.2018 10:50

Спасибо! Увы, мне нужна расширенная поддержка юникода или чего-то еще.

Vao Tsun 02.05.2018 10:55

Другие вопросы по теме