Какой запрос я бы использовал для получения записей одного уровня при использовании таблиц закрытия?
Если у меня есть следующая схема и данные, и я использую шаблон таблицы закрытия:
+----+----------+------------+--------+
| id | ancestor | descendant | length |
+----+----------+------------+--------+
| 1 | 2 | 2 | 0 |
| 2 | 2 | 12 | 1 |
| 3 | 2 | 13 | 1 |
| 4 | 2 | 14 | 1 |
| 5 | 2 | 15 | 1 |
| 10 | 12 | 12 | 0 |
| 11 | 13 | 13 | 0 |
| 12 | 14 | 14 | 0 |
| 13 | 15 | 15 | 0 |
| 9 | 17 | 20 | 1 |
| 8 | 17 | 19 | 1 |
| 7 | 17 | 18 | 1 |
| 6 | 17 | 17 | 0 |
| 14 | 18 | 18 | 0 |
| 15 | 19 | 19 | 0 |
| 16 | 20 | 20 | 0 |
+----+----------+------------+--------+
Как бы выглядел мой запрос на присоединение к моей главной таблице, чтобы получить все одинаковые строки идентификатора строки 2
?
+----+----------+------------+--------+
| id | ancestor | descendant | length |
+----+----------+------------+--------+
| 3 | 2 | 13 | 1 |
| 4 | 2 | 14 | 1 |
| 5 | 2 | 15 | 1 |
+----+----------+------------+--------+
1 ответ
Братья и сестры данного узла будут иметь одного и того же предка. Тем не менее, это будет включать "1", а также ваш список:
select t.*
from table t
where t.ancestor = (select ancestor from table t2 where t.id = 2);
В вашей таблице я не уверен, что это значит для ancestor
быть таким же, как descendant
, Но я думаю, что следующий запрос вам нужен:
select t.*
from table t
where t.ancestor = (select ancestor from table t2 where t2.id = 2) and
t.ancestor <> t.descendant and
t.id <> 2;
РЕДАКТИРОВАТЬ:
Вы можете сделать это как явное соединение следующим образом:
select t.*
from table t join
table t2
on t.ancestor = t2.ancestor and
t2.id = 2 a
where t.id <> 2 and
t.ancestor <> t.descendant;
Примечание: я также добавил условие t.id <> 2
поэтому "2" не считается братом самого по себе.