Результаты группы после присоединения?

Итак, у меня три таблицы. Movies , movies_genres и genres . Я хочу получить фильм по его идентификатору, а также присоединиться к его жанрам в результате. Мне удалось присоединиться к результатам, но он не отображается, как я хочу. Я не уверен, что то, что я прошу, возможно.

Это мой запрос:

 SELECT `movies`.*, GROUP_CONCAT(genres.id) AS genre_id, GROUP_CONCAT(genres.name) AS genre_name FROM (`movies`) INNER JOIN `movies_genres` ON `movies_genres`.`movie_id` = `movies`.`id` INNER JOIN `genres` ON `genres`.`id` = `movies_genres`.`genre_id` WHERE `movies`.`id` = 19908 GROUP BY `movies`.`id` 

Запрос был сгенерирован классом Active Record Codeigniters, вот код Codeigniter, если это помогает:

 $this->db->select('movies.*, GROUP_CONCAT(genres.id) AS genre_id, GROUP_CONCAT(genres.name) AS genre_name'); $this->db->from('movies'); $this->db->where('movies.id', $movie_id); $this->db->join('movies_genres', 'movies_genres.movie_id = movies.id', 'inner'); $this->db->join('genres', 'genres.id = movies_genres.genre_id', 'inner'); $this->db->group_by('movies.id'); 

Вот результат, который я получаю сейчас:

 Array ( [id] => 19908 [movie_title] => Zombieland [overview] => An easily spooked guy... [genre_id] => 28,12,35,27 [genre_name] => Action,Adventure,Comedy,Horror ) 

И это то, что я хочу:

 Array ( [id] => 19908 [movie_title] => Zombieland [overview] => An easily spooked guy... [genres] => array( 0 => array( 'id' => 28, 'name' => Action ), 1 => array( 'id' => 12, 'name' => Adventure ), 1 => array( 'id' => 35, 'name' => Comedy ), 1 => array( 'id' => 27, 'name' => Horror ) ) ) 

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

Solutions Collecting From Web of "Результаты группы после присоединения?"

В запросе, который вы указали, будет указано n строк (где n = # фильмов), тогда как запрос, который, кажется, вы хотите, будет содержать гораздо больше строк (# записей movie_genre). Вероятно, вам лучше оставить этот запрос так, как есть, и сделать некоторую пост-обработку.

Рассматривать:

Получив его, просто запустите свой результат (например, $result ) массив через что-то вроде:

 foreach($result as &$row) { // Split over commas $gi_elements = explode(',', $row['genre_id']); $gn_elements = explode(',', $row['genre_name']); // Build genre $row['genre'] = array(); for($i=0; $i<count($gi_elements); $i++) { $row['genre'][] = array('id' => $gi_elements[$i], 'name' => $gn_elements[$i]); } // Cleanup unset($row['genre_id']); unset($row['genre_name']); } с foreach($result as &$row) { // Split over commas $gi_elements = explode(',', $row['genre_id']); $gn_elements = explode(',', $row['genre_name']); // Build genre $row['genre'] = array(); for($i=0; $i<count($gi_elements); $i++) { $row['genre'][] = array('id' => $gi_elements[$i], 'name' => $gn_elements[$i]); } // Cleanup unset($row['genre_id']); unset($row['genre_name']); } с foreach($result as &$row) { // Split over commas $gi_elements = explode(',', $row['genre_id']); $gn_elements = explode(',', $row['genre_name']); // Build genre $row['genre'] = array(); for($i=0; $i<count($gi_elements); $i++) { $row['genre'][] = array('id' => $gi_elements[$i], 'name' => $gn_elements[$i]); } // Cleanup unset($row['genre_id']); unset($row['genre_name']); } 

Впоследствии, $ results будет выглядеть точно так, как вы пожелаете, без дополнительной работы с базами данных.

EDIT: Исправлены некоторые опечатки.