2016-11-25 8 views
0

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

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

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

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

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

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

ответ

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; 

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

+0

Спасибо за быстрый ответ и пример! Похоже, я был на том же пути: я попробовал LEFT JOIN (без UNION, поскольку таблицы имеют разное количество столбцов), но не мог понять, как отфильтровать возвращаемый набор данных. Как бы вы дифференцировали уровни, чтобы сделать из них древовидную структуру? А также, можете ли вы указать на слабость моего дизайна («огромная избыточность»)? – laciii

+0

Как пример избыточности, что, если контакт связан с несколькими проектами? Насколько я могу судить, здесь нет «уровней», но см. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to -Меня-быть-а-простейшими SQL-запрос – Strawberry