У меня есть две таблицы: таблица 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 |
Может кто-нибудь помочь мне создать запрос, который работает?
Я не понимаю, почему это не работает.