Получить вторую таблицу как подмассив в запросе codeigniter - PullRequest
2 голосов
/ 16 августа 2010

У меня есть две таблицы A и B, а у B много: 1 взаимосвязь с A.

При запросе строк из A я также хотел бы, чтобы соответствующие записи B возвращались в виде массива и добавлялись в массив результатов из A, поэтому я получаю что-то вроде этого:

A-ROW
   field
   field
   B-ITEMS
      item1
      item2
      item3

Есть ли чистый способ сделать это одним запросом (возможно, объединением?), Или мне просто выполнить второй запрос B для идентификатора из A и добавить его в массив результатов?

Ответы [ 3 ]

6 голосов
/ 16 августа 2010

Было бы более эффективно присоединить таблицу B к таблице A. Она не даст вам данные в нужной форме.Но вы можете перебрать этот результат и построить данные в нужной форме.

Вот код, иллюстрирующий эту идею:

// Join table B on table A through a foreign key
$sql = 'select a.id, a.x, b.y
    from a
    left join b on b.a_id=a.id
    order by a.id';

// Execute query
$result = $this->db->query($sql)->result_array();

// Initialise desired result
$shaped_result = array();

// Loop through the SQL result creating the data in your desired shape
foreach ($result as $row)
{
    // The primary key of A
    $id = $row['id'];

    // Add a new result row for A if we have not come across this key before
    if (!array_key_exists($id, $shaped_result))
    {
        $shaped_result[$id] = array('id' => $id, 'x' => $row['x'], 'b_items' => array());
    }

    if ($row['y'] != null)
    {
        // Push B item onto sub array
        $shaped_result[$id]['b_items'][] = $row['y'];
    }
}
1 голос
/ 14 июля 2012

Чтобы построить то, что сказал Smandoli, -

Выполнение дополнительного запроса отдельно более эффективно, потому что даже если изменились данные строки в первичной таблице (A), неизменные данные во вторичной таблице (B)приведет к попаданию (MySQL) в кэш запросов, предполагая, что идентификаторы никогда не изменятся.

Это не обязательно верно для подхода с запросом на соединение.

Также будет меньше данных, поступающих по сети, так какПодход соединения извлекает дубликаты данных для первичной таблицы (A), если вторичная таблица (B) имеет несколько строк, связанных с одной строкой в ​​первичной таблице.

Надеюсь, любой, кто хочет сделать этот (относительно) общий типпоиска данных может найти это полезным.

1 голос
/ 16 августа 2010

"... просто выполните второй запрос B по идентификатору из A и добавьте его в массив результатов ..." - это правильное решение.SQL не будет понимать структуру вложенного массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...