Как написать команду типа «кратчайший путь» или хотя бы команду «найти путь» в MYSQL? - PullRequest
0 голосов
/ 14 октября 2018

Отображение, в таблице есть данные социальных сетей:

u1 u2
0  3
1  2
1  4
2  3
3  1
3  4

Это означает:

  • Пользователь 0 следует за Пользователем 3
  • Пользователь 1 следует за Пользователем 2
  • Пользователь 1 следует за Пользователем 4
  • ...

Теперь я хочу знать: есть ли путь / путь от пользователя 0 кПользователь 2?

Да.Пользователь 0 следует за Пользователем 3. Пользователь 3 следует за Пользователем 1. Пользователь 1 следует за Пользователем 2.

Но как решить эту проблему с помощью SQL-команды?

Iхочу узнать, есть ли такой путь.Необязательно, я хочу знать, каков путь.И можно ли как-нибудь получить кратчайший путь?

1 Ответ

0 голосов
/ 15 октября 2018

Запрос ниже работает в MySQL 8.x, так как для него требуется «Рекурсивное общее табличное выражение» (Recursive CTE):

with n (initial, path, current) as (
  select u1, concat('', u1, '/', u2), u2  from my_table 
    where u1 = 0 -- initial node
  union all 
  select n.initial, concat(n.path, '/', m.u2), m.u2
    from my_table m
    join n on n.current = m.u1
)
select * from n 
  where current = 2 -- target node

Однако, если вы используете MySQL 5.x, вы 'мне не повезло (насколько мне известно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...