2

所以,我有三张桌子。Movies,movies_genresgenres. 我想通过它的 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`

查询是由 Codeigniters Active Record 类生成的,如果有帮助,这里是 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 = 电影数),而您似乎想要的查询将有更多行(电影类型的条目数)。您最好保留该查询,并进行一些后期处理。

考虑:

得到它之后,只需通过以下方式运行您的结果(例如$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 回答