У меня три таблицы: проекты, списки, элементы.
Проект присоединяется к спискам на project_id
, и элементы соединяются с списками в list_id
, и цель состоит в том, чтобы иметь все данные строки для каждого.
Что я пробовал? Ну, на самом деле я смог сделать это только тремя отдельными запросами / выводами, а затем просто перебирал через них PHP для объединения данных.
Возможно ли написать запрос таким образом, что я получаю один объект данных, который я могу легко прокрутить?
project (w details) -- list (and its details) ----- item (w details) ----- item (w details) ----- item (w details) -- list (w details) ----- item (w details) ----- item (w details)
Вы имеете в виду вот так:
select a.project_id, b.list_id, c.item_id from projects a join lists b on a.project_id=b.project_id join items c on b.list_id=c.list_id
Результат будет примерно таким:
project_id | list_id | item_id 1 | 5 | 45 1 | 5 | 46 1 | 8 | 12
Или вы хотите вернуть все его части за один ряд?
Если вам нужна одна строка, вы можете сделать что-то вроде:
select a.project_id, group_concat(b.list_id) as listIDs, group_concat(c.item_id) as itemIDs from projects a join lists b on a.project_id=b.project_id join items c on b.list_id=c.list_id
Но он будет беспорядочным в PHP, чтобы иметь дело со всеми сгруппированными вещами.
Результат будет примерно таким:
project_id | list_id | item_id 1 | 5,8 | 45, 46, 12
Вы также можете смешивать и сопоставлять два, чтобы получить лучшее из обоих миров:
select a.project_id, b.list_id as listIDs, group_concat(c.item_id) as itemIDs from projects a join lists b on a.project_id=b.project_id join items c on b.list_id=c.list_id
Результат будет примерно таким:
project_id | list_id | item_id 1 | 5 | 45, 46 1 | 8 | 12
Попробуйте: Если вы хотите отобразить способ проецирования
select a.project_id, b.list_id, c.item_id from projects a left join lists b on a.project_id=b.project_id left join items c on b.list_id=c.list_id order by b,c