Выбрать все запросы с идентификатором ссылки в цепочке - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть эта таблица, в которой я хотел бы хранить цепочку записей.

CREATE TABLE table_name (
    id INT,
    unique_id varchar,
    reference_id varchar,
);

Я хочу реализовать SQL-запрос для MariDB, который печатает все записи по id со всеми записями с reference_id.Примерно так:

| id | unique_id | reference_id |   |   |
|----|-----------|--------------|---|---|
| 43 | 55544     |              |   |   |
| 45 | 45454     | 43           |   |   |
| 66 | 55655     | 45           |   |   |
| 78 | 88877     | 66           |   |   |
| 99 | 454       | 33           |   |   |

Я бы хотел, чтобы при выборе записи 66 были получены все транзакции вверх и вниз, потому что друг друга используют id, который указывает на них.Как я могу реализовать это с помощью рекурсивного CTE?Есть ли лучший способ?

Ожидаемый результат для записи с unique_id 66:

| id | unique_id | reference_id |   |   |
|----|-----------|--------------|---|---|
| 43 | 55544     |              |   |   |
| 45 | 45454     | 43           |   |   |
| 66 | 55655     | 45           |   |   |
| 78 | 88877     | 66           |   |   |

Я пробовал это, но строки выше не печатаются.

select @ref:=id as id, unique_id, reference_id
from mytable
join (select @ref:=id from mytable WHERE reference_id=@ref or id = 66)tmp
where reference_id=@ref

Демонстрация на DB Fiddle

Можете ли вы дать мне руку, чтобы найти решение?

РЕДАКТИРОВАТЬ: Попытка с CTE:

with recursive cte as (
      select t.*
      from mytable
      where t.id = 66
      union all
      select t.*
      from cte join
           mytable t
           on cte.id = t.reference_id
     )
select *
from cte;

Я получаю ошибку Unknown table 't'

1 Ответ

0 голосов
/ 05 февраля 2019

Я не знаком с рекурсивным CTE.Вы можете попробовать следующий запрос.

select t.id, t.unique_id, @uid := t.reference_id reference_id
from (select * from mytable order by id desc) t
join (select @uid := 66) tmp
where t.id = @uid or reference_id=66
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...