Итак, у меня три таблицы. 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 ) ) )
Возможно ли это, и если да, то как?
В запросе, который вы указали, будет указано 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: Исправлены некоторые опечатки.