Я уже давно создаю веб-страницы 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, ...)
Я пытаюсь выполнить рекурсивный запрос с изюминкой: если я предоставлю идентификатор любого уровня (с указанием уровня, к которому принадлежит идентификатор), он должен вернуть уровни как родительских, так и дочерних записей в древовидной структуре.
Например: у меня есть идентификатор проекта, поэтому я хотел бы вернуть клиента (родителя), которому принадлежит проект, а также контакты, файлы и события проекта (дочерние элементы). Или, если у меня есть идентификатор события, я хотел бы вывести проект (родитель), клиент (родитель родитель), а также контакты и файлы (которые находятся на том же уровне, что и события).
Смысл в том, чтобы увидеть полную историю выбранного элемента. Это возможно даже с одним запросом …? Любые предложения приветствуются и приветствуются!
Такой запрос вернет весь набор данных:
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 или подобном. Обратите внимание, что ваш текущий дизайн обладает огромной избыточностью!
Других решений пока нет …