Как вложить результаты sql с помощью объединений

#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()
                                           );
       }
   }

}