Как я могу получить списки в списках (аналогично многомерным массивам)? - PullRequest
0 голосов
/ 17 сентября 2009

Это проблема, с которой я часто сталкиваюсь, и мое решение всегда должно выполнять множество запросов, но я чувствую, что должен быть лучший путь Вот мои две таблицы для этого примера:

Artists
ID
Имя

Песни
ID
artistID
Имя
жанр

Таблица связана так:
artist.id <-> songs.artistID

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

array(0 => array('name' => 'Artist A'
                  , 'songs' => array(0 => array('name' => 'Song 1'
                                               , 'genre' => 'rock'
                                               )
                                     )
                                     1 => array('name' => 'Song 2'
                                               , 'genre' => 'rock'
                                               )
                                     )
                 )
      1 => array('name' => 'Artist B'
                  , 'songs' => array(0 => array('name' => 'Song 3'
                                               , 'genre' => 'rap'
                                               )
                                     )
                                     1 => array('name' => 'Song 4'
                                               , 'genre' => 'rap'
                                               )
                                     )
                 )
      )

(я знаю, что это не формат MySQL, но это самый близкий способ, который я мог бы объяснить)

Возможно ли это? Если да, то как?

Спасибо!

Ответы [ 3 ]

1 голос
/ 17 сентября 2009

Лучшее, что я могу предложить, - это запрос для родительских записей, за которым следует запрос для детей, использующий запрос in (parent id list). Это даст вам два набора данных. Один для родителей и один для детей. На стороне клиента вы можете взять родительский идентификатор и получить набор дочерних записей.

1 голос
/ 17 сентября 2009

Вариант 1:

  1. Запрос таблицы художников
  2. Для каждого художника:
    1. сохранить информацию в массиве.
    2. запросить таблицу песен и прикрепить результаты к массиву

PROs:
Из базы данных не передается ненужная информация.

Недостатки:
Потенциально много и много запросов выполняется.

Вариант 2:

  1. Запрос к обеим таблицам с помощью JOIN (возможно, лучше использовать левое соединение), порядок по исполнителю
  2. Для каждого ряда:
    1. Проверьте, совпадает ли исполнитель этой строки с последним:
      • , если нет, сохранить информацию об исполнителе в верхний уровень массива
    2. Сохранить информацию о песне в подмассиве массива исполнителя

PROs:
Требуется только один запрос.

Недостатки:
Потенциально много и много ненужных данных, передаваемых из БД.

0 голосов
/ 17 сентября 2009

Боюсь, что невозможно делать то, что вы хотите, потому что SQL по своей сути является языком, основанным на множествах. Вы можете получить всю информацию, которую вы ищете, за один вызов с помощью объединения таблиц, но после этого вам придется анализировать их и сохранять в структуре, которую вы упомянули.

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