2

だから、私は3つのテーブルを持っています。Moviesmovies_genresおよびgenres。そのIDで映画を手に入れ、そのジャンルにも参加したいと思っています。結果に参加できましたが、希望どおりに表示されません。私が求めていることが可能かどうかはわかりません。

これは私の質問です:

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`

クエリはCodeignitersActiveRecordクラスによって生成されました。これが役立つ場合は、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
        )
    )
)

これは可能ですか?もしそうなら、どのように?

4

1 に答える 1

1

リストしたクエリには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']);
}

その後、$ resultsは、追加のデータベース作業なしで、希望どおりに表示されます。

編集:いくつかのタイプミスを修正しました。

于 2012-06-26T14:22:34.427 に答える