MySQL иерархический рекурсивный запрос

Я уже давно создаю веб-страницы PHP, но я не очень знаком с базами данных MySQL. Я тщательно искал решения таких проблем, как у меня, но безуспешно (хотя были ответы на подобные вопросы, я не мог понять, как реализовать предоставленное решение).

У меня есть 5 таблиц в трехуровневой иерархической структуре следующим образом:

Clients (id, name, ...)
↳ Projects (id, client_id, name, ...)
↳ Contacts (id, project_id, name, ...)
↳ Files (id, project_id, name, ...)
↳ Events (id, project_id, name, ...)

Я пытаюсь выполнить рекурсивный запрос с изюминкой: если я предоставлю идентификатор любого уровня (с указанием уровня, к которому принадлежит идентификатор), он должен вернуть уровни как родительских, так и дочерних записей в древовидной структуре.

Например: у меня есть идентификатор проекта, поэтому я хотел бы вернуть клиента (родителя), которому принадлежит проект, а также контакты, файлы и события проекта (дочерние элементы). Или, если у меня есть идентификатор события, я хотел бы вывести проект (родитель), клиент (родитель родитель), а также контакты и файлы (которые находятся на том же уровне, что и события).

Смысл в том, чтобы увидеть полную историю выбранного элемента. Это возможно даже с одним запросом …? Любые предложения приветствуются и приветствуются!

0

Решение

Такой запрос вернет весь набор данных:

SELECT columns
, I
, actually
, want
FROM clients c
LEFT
JOIN projects p
ON p.fk = c.pk
LEFT
JOIN
( SELECT 'contact' type, common, columns FROM contacts
UNION
SELECT 'file', etc
UNION etc
) x
ON x.fk = p.pk;

Вы можете легко присоединить предложение WHERE к этому или, если набор данных не так велик, просто обработать фильтрацию в JavaScript или подобном. Обратите внимание, что ваш текущий дизайн обладает огромной избыточностью!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]