Как получить записи дерева уровней n с точным номером потомка, используя запрос mysql - PullRequest
0 голосов
/ 02 мая 2020

Я застрял, чтобы найти n уровней дерева записей с точным количеством дочерних узлов.

Позвольте мне кратко объяснить, что я ожидал, используя MySQL запрос

All users has exact number of child users for example 2

Пожалуйста, проверьте следующее изображение enter image description here

Если у уровней есть точное количество пользователей, то этот уровень завершен, в противном случае он не завершен.

вот моя таблица

CREATE TABLE `users` (
  `id` bigint(20) UNSIGNED NOT NULL autoincrement,
  `first_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `last_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `parent_id` bigint(20) UNSIGNED DEFAULT NULL,
);

Можете ли вы, пожалуйста, помочь кому-нибудь за то же самое.

Буду признателен за вашу помощь.

Спасибо

1 Ответ

0 голосов
/ 02 мая 2020

Если вам это нужно, и это не какое-то упражнение, просто создайте столбец «Уровень» в этой таблице и увеличьте «Уровень» дочерней строки на parent.Level + 1 при выполнении операций INSERT или UPDATE.

CREATE TABLE test (
  `id` bigint(20) UNSIGNED PRIMARY KEY auto_increment,
  `first_name` varchar(255) NOT NULL,
  `last_name` varchar(255) DEFAULT NULL,
  `level` int(4) NOT NULL DEFAULT 0,
  `parent_id` bigint(20) UNSIGNED DEFAULT NULL
);

INSERT INTO test (`first_name`, `last_name`, `level`, `parent_id`)
VALUES ('A', 'A', 0, NULL),
('B1', 'A', 1, 1),
('B2', 'A', 1, 1),
('C1', 'B1', 2, 2),
('C2', 'B1', 2, 2),
('C3', 'B2', 2, 3),
('C4', 'B2', 2, 3),
('D1', 'C1', 3, 4),
('D2', 'C1', 3, 4),
('D3', 'C2', 3, 5),
('D4', 'C2', 3, 5),
('D5', 'C3', 3, 6),
('D6', 'C4', 3, 7);

SELECT 
    final.`first_name` as`User Name`,
    final.`level`,
    CASE
        WHEN final.`childs` < 2 THEN
            'false'
        ELSE
            'true'
    END as `IsCompleted`
FROM (
    SELECT 
        t.`first_name`,
        t.`level`,
        COUNT(c.`parent_id`) as `childs`
    FROM test t
    LEFT JOIN (
    SELECT
        jt1.`parent_id`
    FROM test jt1
    ) as c ON t.`id` = c.`parent_id`
    GROUP BY t.`first_name`, 
        t.`level`
) as final;

БД скрипка

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