MySQL получает число родителей иерархического порядка с объединениями - PullRequest
0 голосов
/ 05 июня 2019

У меня есть две таблицы: таблица paragraphs, представляющая все существующие текстовые блоки, и таблица documents, представляющая заказ для определенного веб-сайта. Вот мои столы:

CREATE TABLE paragraphs (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title TEXT CHARACTER SET utf8 COLLATE utf8_german2_ci NOT NULL,
    txt TEXT CHARACTER SET utf8 COLLATE utf8_german2_ci
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE documents (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    paragraph INT NOT NULL,
    lft INT NOT NULL,
    rgt INT NOT NULL,
    website INT NOT NULL,
    FOREIGN KEY (paragraph) REFERENCES paragraphs(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Я нашел много решений для запросов, чтобы получить иерархические структуры, но не решения для иерархических структур с двумя отдельными таблицами. Я пробовал совершенно разные идеи, и это дает мне структуру конкретного веб-сайта (например, веб-сайт с id = 1):

SELECT DISTINCT p.title
FROM documents as st1
INNER JOIN documents as st2 ON st1.paragraph = st2.paragraph
INNER JOIN paragraphs as p ON st2.paragraph = p.id
WHERE st1.lft BETWEEN st2.lft AND st2.rgt
AND st2.website = 1
ORDER BY st1.lft;

Но теперь я пытаюсь получить путь или маршрут, соответственно количество родителей от всех узлов до корня.

Например, вставка:

INSERT INTO paragraphs (id,title,category)VALUES(11,'Heading 8',2);
INSERT INTO paragraphs (id,title,category)VALUES(12,'Heading 8.1',2);
INSERT INTO paragraphs (id,title,category)VALUES(13,'Heading 8.1.1',2);
INSERT INTO paragraphs (id,title,category)VALUES(14,'Heading 8.1.2',2);
INSERT INTO paragraphs (id,title,category)VALUES(23,'Heading 10',1);

INSERT INTO documents (website,paragraph,lft,rgt)VALUES(1,11,1,8);
INSERT INTO documents (website,paragraph,lft,rgt)VALUES(1,12,2,7);
INSERT INTO documents (website,paragraph,lft,rgt)VALUES(1,13,3,4);
INSERT INTO documents (website,paragraph,lft,rgt)VALUES(1,14,5,6);
INSERT INTO documents (website,paragraph,lft,rgt)VALUES(1,23,9,10);

Я нашел решения для одной таблицы без объединений и попытался изменить и объединить эти решения для моего сценария с двумя таблицами и объединениями, но моя попытка дает мне 0 для всех строк:

SELECT st1para.title, (COUNT(st2para.title) - 1) AS depth
FROM documents AS st1
INNER JOIN paragraphs AS st1para ON st1.paragraph = st1para.id
JOIN documents AS st2 ON st1.paragraph = st2.paragraph
INNER JOIN paragraphs AS st2para ON st2.paragraph = st2para.id
WHERE st1.lft BETWEEN st2.lft AND st2.rgt
GROUP BY st1para.title
ORDER BY st1.lft;

Результат:

|    title     |  depth  |
|--------------|---------|
|Heading 8     |    0    |
|Heading 8.1   |    0    |
|Heading 8.1.1 |    0    |
|Heading 8.1.2 |    0    |
|Heading 10    |    0    |

Может кто-нибудь помочь мне создать запрос, который работает? Я не понимаю, почему это не работает.

...