powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Дерево в 8.++
12 сообщений из 12, страница 1 из 1
Дерево в 8.++
    #39939918
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как строить дерево для 5 версии уже было
а как для 8.++
тема была поднята 21201569
но тишина

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE spr_type (
  id int NOT NULL AUTO_INCREMENT,
  id_parent int DEFAULT 0,
  level int DEFAULT 0,
  name varchar(255) DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE INDEX UK_spr_type (id, id_parent)
)
ENGINE = INNODB,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_unicode_ci;


есть предложения?
...
Рейтинг: 0 / 0
Дерево в 8.++
    #39939925
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
BEGIN

  SET @@cte_max_recursion_depth = 800;
  WITH RECURSIVE Rec (id, id_parent, name)
  AS
  (SELECT
        id,
        id_parent,
        name
      FROM spr_type st
    UNION ALL
    SELECT
      Rec.id,
      Rec.id_parent,
      Rec.name
    FROM Rec,
         spr_type
    WHERE Rec.id = spr_type.id_parent)
  SELECT
    *
  FROM Rec
  WHERE id_parent IS NULL;
END


Recursive query aborted after 801 iterations. Try increasing @@cte_max_recursion_depth to a larger value.
...
Рейтинг: 0 / 0
Дерево в 8.++
    #39939927
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
Recursive query aborted after 801 iterations.
Или дерево больше, или имеет место циклическая ссылка.
...
Рейтинг: 0 / 0
Дерево в 8.++
    #39939928
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Или дерево больше, или имеет место циклическая ссылка.
дерево не большое
циклическая ссылка есть - RECURSIVE
но как исправить?
и верно ли так делать?
...
Рейтинг: 0 / 0
Дерево в 8.++
    #39939935
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если дерево может иметь циклическую ссылку, следует в CTE строить FQP и проверять на повторное вхождение.
...
Рейтинг: 0 / 0
Дерево в 8.++
    #39939940
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Если дерево может иметь циклическую ссылку, следует в CTE строить FQP и проверять на повторное вхождение.
нет такого
вот пример http://www.programmersought.com/article/45851813002/ (в конце)
вот данные
"id""id_parent""level""name"1null0"aaaaa"2null0"ggggg"311"eeeee"4null1"ffff"510"ttttsfasfa"650"ggggggg"
...
Рейтинг: 0 / 0
Дерево в 8.++
    #39939942
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
вот пример http://www.programmersought.com/article/45851813002/ (в конце)
вроде аналогичный...
...
Рейтинг: 0 / 0
Дерево в 8.++
    #39939952
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда... догадался посмотреть на твой запрос. Прослезился...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WITH RECURSIVE 
cte AS ( SELECT id, 
                id_parent, 
                0 level, 
                name, 
                name FQP
         FROM spr_type
         WHERE id_parent IS NULL
       UNION ALL
         SELECT spr_type.id, 
                spr_type.id_parent, 
                cte.level + 1, 
                spr_type.name, 
                CONCAT(cte.FQP, '/', spr_type.name)
         FROM spr_type
         JOIN cte ON cte.id = spr_type.id_parent )
SELECT * 
FROM cte;



fiddle .
...
Рейтинг: 0 / 0
Дерево в 8.++
    #39939954
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Мда... догадался посмотреть на твой запрос. Прослезился...
я его скопипастил,
и счас сам разобрался :)
...
Рейтинг: 0 / 0
Дерево в 8.++
    #39939992
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такое

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5e5ed151c81b3056f601defd045ea828


результат строка html

если вставить эту строку куда следует, получим https://jsfiddle.net/akhouncb/

вроде получается правильно, но хотелось бы подтверждения, что не ошибаюсь

большая просьба проверить
...
Рейтинг: 0 / 0
Дерево в 8.++
    #39940597
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
более правильный вариант
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=619c0de1faaf9cf2ecfd6483cedf82bb
https://jsfiddle.net/01usLbhk/

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
CREATE TABLE spr_type (
  id int NOT NULL AUTO_INCREMENT,
  id_parent int DEFAULT NULL,
  order_ int DEFAULT NULL,
  name varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 9,
AVG_ROW_LENGTH = 2048,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_unicode_ci;

ALTER TABLE spr_type
ADD CONSTRAINT spr_type_ibfk_1 FOREIGN KEY (id_parent)
REFERENCES spr_type (id);

INSERT INTO spr_type VALUES
(1, NULL, 1, 'aaaaa'),
(2, NULL, 2, 'ggggg'),
(3, 1, 2, 'eeeee'),
(4, NULL, 3, 'ffff'),
(5, 1, 1, 'ttttsfasfa'),
(6, 5, 2, 'ggggggg'),
(7, 5, 1, 'рррррррррррррр'),
(8, 2, 1, '000000000000');


 SET @a = 1;

  SELECT
    CONCAT('<ul class="treeCSS">', GROUP_CONCAT(d), '</ul>') dd
  FROM (WITH RECURSIVE Rec (id, name, id_parent, order_, ll)
      AS
      ((SELECT
              id,
              name,
              IFNULL(id_parent, 0),
              CAST(order_ AS char(200)),
              1
            FROM spr_type
            WHERE id_parent IS NULL
            ORDER BY order_)
        UNION ALL
        SELECT
          spr_type.id,
          spr_type.name,
          spr_type.id_parent,
          CONCAT(Rec.order_, spr_type.order_),
          CHAR_LENGTH(CONCAT(Rec.order_, spr_type.order_))
        FROM Rec
          JOIN spr_type
            ON Rec.id = spr_type.id_parent)
    SELECT
      CASE WHEN @a < ll THEN CONCAT('<ul><li>', name, LL) WHEN @a > ll THEN CONCAT('</ul><li>', name, ll) WHEN @a = ll THEN CONCAT('<li>', name, ll) END AS d,
      @a := ll AS ll,
      id
    FROM Rec
    ORDER BY order_) AS ff;


...
Рейтинг: 0 / 0
Дерево в 8.++
    #39941970
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в данное дерево надо вставить новую ветку / новый узел / под_узел
данные для вставки: id узла, место вставки перед/после данного узла, порядковый номер текущего узла, порядковый номер вставляемого узла(если нужно)
если есть необходимость можно и другие данные использовать

подскажите алгоритм/вариант кода
пока ничего простого не приходит...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Дерево в 8.++
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]