У меня есть рекурсивная таблица, чтобы указать отношение надзора, где человек может контролировать многих людей и контролироваться многими другими людьми.
Вот пример данных:
+--------+------------+ | person | supervises | +--------+------------+ | 1 | 2 | | 1 | 3 | | 1 | 4 | | 1 | 7 | | 3 | 5 | | 4 | 5 | | 5 | 8 | | 4 | 6 | | 4 | 7 | | 6 | 9 | | 7 | 9 | | 9 | 14 | | 14 | 15 | | 3 | 15 | | 7 | 10 | | 7 | 11 | | 7 | 12 | | 7 | 13 | +--------+------------+
Из которых синие узлы представляют большее поддерево, а красные узлы представляют корень большего дерева.
Моя проблема заключается в том, чтобы создать запрос MariaDb(10.4.1)/Mysql, который, учитывая узел, например узел номер 1:
select largerId, amount from .... +-----------+--------+ | largerId | amount | +-----------+--------+ | 7 | 5 | +-----------+--------+
select .... where id = 1 +-----------+ | count(id) | +-----------+ | 15 | +-----------+
другой пример
select .... where id = 7 +-----------+ | count(id) | +-----------+ | 8 | +-----------+
Это не требует рекурсии, поскольку вас интересуют только прямые дети.
Для первого GROUP BY person
и ограничьте результат верхней строкой в порядке убывания.
SELECT person,
count(*)
FROM elbat
GROUP BY person
ORDER BY count(*) DESC
LIMIT 1;
Для второго посчитайте UNION
всех значений person
и supervises
.
SELECT count(*)
FROM (SELECT supervises
FROM elbat
UNION
SELECT person
FROM elbat) x;