В моей базе данных есть таблица, которая выглядит примерно так:
CREATE TABLE locations (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
group_id BIGINT,
type VARCHAR(255)
FOREIGN KEY (group_id) REFERENCES locations(id)
);
Другими словами, иерархия мест. Каждое местоположение - это либо группа (type = 'group'
), либо обычное местоположение (type IS NULL
). Обе группы и обычные местоположения могут принадлежать к «родительской» группе, на которую ссылается group_id
. Только группы могут служить родителями; обычные места не могут. Итак, учитывая эти записи:
INSERT INTO locations (id, name, group_id, type) VALUES
(1, 'Top-level 1', NULL, 'group'),
(2, 'Mid-level', 1, 'group'),
(3, 'Location 1', 2, NULL),
(4, 'Location 2', 2, NULL),
(5, 'Location 3', 1, NULL),
(6, 'Top-level 2', NULL, 'group'),
(7, 'Location 4', 6, NULL);
Я бы хотел запросить местоположения, которые имеют "Top-level 1" в любом месте в их родительской цепочке. Записи ID 3, 4 и 5 должны быть возвращены; 7 не должен.
Если бы это был просто один необязательный родитель, это было бы легко: один INNER JOIN
. Проблема, с которой я сталкиваюсь, состоит в том, что в структуре может быть произвольное количество родителей: в этом примере есть два уровня родителей, но это может быть что угодно. Мне также нужно решение для работы с родителями, не относящимися к высшему уровню, - если вместо этого я запросил местоположения со средним уровнем в их родительской цепочке, это также должно сработать.
Я ожидаю, что ответ будет отрицательным - или, по крайней мере, определенно не с JOINS и WHERE - но есть ли способ сделать это?