Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Дерево в 8.++ / 12 сообщений из 12, страница 1 из 1
21.03.2020, 18:19
    #39939918
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
как строить дерево для 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
21.03.2020, 19:00
    #39939925
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
Код: 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
21.03.2020, 19:16
    #39939927
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
вадя
Recursive query aborted after 801 iterations.
Или дерево больше, или имеет место циклическая ссылка.
...
Рейтинг: 0 / 0
21.03.2020, 19:19
    #39939928
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
Akina
Или дерево больше, или имеет место циклическая ссылка.
дерево не большое
циклическая ссылка есть - RECURSIVE
но как исправить?
и верно ли так делать?
...
Рейтинг: 0 / 0
21.03.2020, 19:49
    #39939935
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
Если дерево может иметь циклическую ссылку, следует в CTE строить FQP и проверять на повторное вхождение.
...
Рейтинг: 0 / 0
21.03.2020, 20:10
    #39939940
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
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
21.03.2020, 20:23
    #39939942
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
вадя
вот пример http://www.programmersought.com/article/45851813002/ (в конце)
вроде аналогичный...
...
Рейтинг: 0 / 0
21.03.2020, 21:21
    #39939952
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
Мда... догадался посмотреть на твой запрос. Прослезился...

Код: 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
21.03.2020, 21:26
    #39939954
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
Akina
Мда... догадался посмотреть на твой запрос. Прослезился...
я его скопипастил,
и счас сам разобрался :)
...
Рейтинг: 0 / 0
22.03.2020, 00:59
    #39939992
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
есть такое

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


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

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

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

большая просьба проверить
...
Рейтинг: 0 / 0
24.03.2020, 15:13
    #39940597
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
более правильный вариант
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
29.03.2020, 10:39
    #39941970
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево в 8.++
в данное дерево надо вставить новую ветку / новый узел / под_узел
данные для вставки: id узла, место вставки перед/после данного узла, порядковый номер текущего узла, порядковый номер вставляемого узла(если нужно)
если есть необходимость можно и другие данные использовать

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


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