#php #sql #join
#php #sql #Присоединиться
Вопрос:
У меня есть таблицы DB
Macro Table:
ID | title | description
Micro Table:
ID | title | description | macro_id
идентификатор macro_id в «микротаблице» совпадает с идентификатором «Таблицы макросов». У меня много микропроцессоров в один Maco.
Я пытаюсь написать оператор sql, который дал бы мне некоторый результат, подобный этому, в PHP.
[
{
ID : 3, title : "some title", description : "some desc", micros : [
{
ID : some number,
title : "some title",
description : "some description",
macro_id : 3
}
]
}
]
Массив объектов, где каждый объект из таблицы макросов, а затем внутри каждого макрообъекта массив «микро» объектов, которые идут с этим конкретным макроком, на основе совпадающих идентификаторов «macro_id» в таблице микро и «ID» в таблице макрокоманд
Я пробовал выполнять различные объединения
SELECT * FROM macros JOIN micros ON macros.macro_id=micros.micro_id
Но это просто возвращает его в одной строке, вместо того, чтобы вкладывать его.
РЕДАКТИРОВАТЬ: Это то, что я делаю (это в codeigniter), что дает мне результат, который я ищу. Это просто кажется неэффективным
$this->load->model('macros_model','',true);
$this->load->model('micros_model', '', true);
$all_macros = $this->macros_model->get_all_macros();
$all_lessons = array();
foreach($all_macros as $macro){
$micros = $this->micros_model->get_all_micros_for_macro($macro['macro_id']);
$macro['micros'] = $micros;
array_push($all_lessons, $macro);
}
Sql-запросы в get_all_macros и get_all_micros_for_macro — это просто SELECT * ИЗ макросов и SELECT * ИЗ микро, ГДЕ macro_id = $ macro_id
Комментарии:
1. Вам нужно более четко представлять точный результат, который вы ожидаете от своего запроса.
2. @juergend обновлен, чтобы сделать его немного более понятным
3. Я имел в виду: поскольку SQL-запрос возвращает не объекты, а только строки, было бы лучше добавить ожидаемый результат sql, а не вывод PHP после чтения и обработки запроса.
4. Так что, возможно, я задаю неправильный вопрос… Я думаю, если я хочу, чтобы результат был таким, как я описываю, мне нужно выполнить несколько SQL-запросов? Я думаю, вопрос в том, как мне получить этот результат, который я ищу?
5. Я думаю, это можно сделать с помощью одного запроса. А затем обработать в PHP. Но я не могу говорить о части PHP из-за недостатка знаний об этом.
Ответ №1:
Следующий пример может быть полезен (хотя и не тестировался)..
$query = '
SELECT
macroTable.ID as macroID,
macroTable.Title as macroTitle,
macroTable.Description as macroDescription,
microTable.ID as microID,
microTable.ID as microTitle,
microTable.ID as microDescription
FROM
macroTable
INNER JOIN microTable ON macroTable.ID = microTable.macro_id
ORDER BY
macroID
';
$resultArray = executeQuery($query);
if ($resultArray){
$nestedResults = array();
$foreach ($resultArray as $row){
$macroId = $row['macroID'];
if (isset($nestedResults)){
$nestedResults[$macroId]['micros'][] = array(
'microID' => $row['microID'],
'microTitle' => $row['microTitle'],
'microDescription' => $row['microDescription'],
);
} else {
$nestedResults[$macroId] = array(
'macroTitle' => $row['macroTitle'],
'macroDescription' => $row['macroDescription'],
'micros' => array()
);
}
}
}