Могу ли я иметь условие WHERE на верхнем уровне произвольного числа объединений? - PullRequest
0 голосов
/ 24 января 2019

В моей базе данных есть таблица, которая выглядит примерно так:

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 - но есть ли способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...