Как проверить значение столбца всех родительских записей дочернего элемента в SQL - PullRequest
1 голос
/ 26 марта 2020

Допустим, у нас есть одна таблица с 3 столбцами: ID , PARENT_ID и VALUE .

У нас есть, например, 8 записей :

ID PARENT_ID VALUE
A  NULL      1
B  A         1
C  B         0
D  C         1
E  D         1
F  E         1
G  F         1
H  G         0   

Как мы можем проверить, используя запрос SQL или хранимую процедуру (предпочтительно для MySQL), если какая-либо из родительских записей для записи с идентификатором «G» имеет значение 0? Если у родителя из цепочки есть 0 для VALUE, нет необходимости проверять еще раз.

Это должно сработать, взяв любой дочерний ID и просматривая всю цепочку его родителей до этот ребенок. У какого-то ребенка может не быть родителей или цепочка родителей, а в родительской записи может быть 0 или несколько дочерних записей.

В этом примере поиск заканчивается в записи с идентификатором "C" ( ie: вернуть этот идентификатор в порядке), поскольку это родительская запись цепочки родителей (для G), которая равна 0 для VALUE.

1 Ответ

1 голос
/ 26 марта 2020

Вот пример MySQL 8.0 рекурсивного запроса CTE, который выполняет то, что вы описываете, пересекает предков 'G' и возвращает тех, которые имеют значение = 0:

with recursive cte as (
  select * from mytable where id = 'G'
  union all
  select t.* from cte join mytable t on t.id = cte.parent_id
) select * from cte where value = 0;

+------+-----------+-------+
| id   | parent_id | value |
+------+-----------+-------+
| C    | B         |     0 |
+------+-----------+-------+

Чтение https://dev.mysql.com/doc/refman/8.0/en/with.html для получения дополнительной информации о рекурсивных запросах CTE.

...