Реконструкция пути узла SQL


У меня есть таблица, которая содержит данные о том, какой узел был посещен. Возможно, что узел может быть посещен несколько раз. Для этого у меня есть другая таблица, которая содержит данные посещаемого узла, узла, посещенного до и узла, посещенного после. Теперь я хотел бы восстановить путь в порядке посещения, используяMySQL . Я не могу понять, как сделать запрос на это, поэтому я прошу здесь о помощи.

Пример

Допустим, кто-то посетил эти узлы в таком порядке:

4->5->6->7->4->6->10->12->7->15

Таблицы будут выглядеть следующим образом:

Визиты

+---------+-------------------------------+----------+------------+
| id      | user                          | node     | view_count |
+---------+-------------------------------+----------+------------+
| 1       | l3lie1frl77j135b3fehbjrli5    | 4        | 2          |
+---------+-------------------------------+----------+------------+
| 2       | l3lie1frl77j135b3fehbjrli5    | 5        | 1          |
+---------+-------------------------------+----------+------------+
| 3       | l3lie1frl77j135b3fehbjrli5    | 6        | 2          |
+---------+-------------------------------+----------+------------+
| 4       | l3lie1frl77j135b3fehbjrli5    | 7        | 2          |
+---------+-------------------------------+----------+------------+
| 5       | l3lie1frl77j135b3fehbjrli5    | 10       | 1          |
+---------+-------------------------------+----------+------------+
| 6       | l3lie1frl77j135b3fehbjrli5    | 12       | 1          |
+---------+-------------------------------+----------+------------+
| 7       | l3lie1frl77j135b3fehbjrli5    | 15       | 1          |
+---------+-------------------------------+----------+------------+

Revisits

+---------+-------------------------------+-------+----------------+-----------------+
| id      | user                          | node  | after_visiting | before_visiting |
+---------+-------------------------------+-------+----------------+-----------------+
| 1       | l3lie1frl77j135b3fehbjrli5    | 4     |       7        |        6        |
+---------+-------------------------------+-------+----------------+-----------------+
| 2       | l3lie1frl77j135b3fehbjrli5    | 6     |       4        |       10        |
+---------+-------------------------------+-------+----------------+-----------------+
| 3       | l3lie1frl77j135b3fehbjrli5    | 7     |      12        |       15        |
+---------+-------------------------------+-------+----------------+-----------------+

Я хотел бы построить запрос, который вернул бы путь в виде строки или списка узлов, как это:

4,5,6,7,4,6,10,12,7,15

Или

+---------+--------+
| index   | node   |
+---------+--------+
|    1    |   4    |
+---------+--------+
|    2    |   5    |
+---------+--------+
|    3    |   6    |
+---------+--------+
|    4    |   7    |
+---------+--------+
|    5    |   4    |
+---------+--------+
|    6    |   6    |
+---------+--------+
|    7    |   10   |
+---------+--------+
|    8    |   12   |
+---------+--------+
|    9    |   7    |
+---------+--------+
|    10   |   15   |
+---------+--------+
Любая помощь будет очень признательна.
1 3

1 ответ:

Измените свой дизайн, чтобы иметь 1 таблицу посещений:

+----+------+------+
| id | user | node |
+----+------+------+
|  1 | xx   |    4 |
|  2 | xx   |    5 |
|  3 | xx   |    6 |
|  4 | xx   |    7 |
|  5 | xx   |    4 |
|  6 | xx   |    6 |
|  7 | xx   |   10 |
|  8 | xx   |   12 |
|  9 | xx   |    7 |
| 10 | xx   |   15 |
+----+------+------+


затем вы можете выбрать view_count следующим образом:
select node, count(*) view_count
from visits
where user = :user
group by node

И путь такой:

select group_concat(node order by id separator ',') path
from visits
where name = :name