2012-06-26 2 views
1

그래서 세 개의 테이블이 있습니다. Movies, movies_genresgenres. 나는 이드가 영화를 만들고 그 결과로 장르에 합류하기를 원한다. 결과에 참여할 수 있었지만 원하는대로 표시되지 않습니다. 내가 묻는 것이 가능하면 잘 모르겠다. 그 도움이된다면가입 후 그룹 결과?

이 쿼리는 Codeigniters 액티브 레코드 클래스에 의해 생성 된
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` 

, 여기에 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 
     ) 
    ) 
) 

이 경우 가능합니까?

답변

0

당신이 N 행이됩니다 나열된 쿼리 (여기서 N = 영화 #) 당신이 더 많은 행 (MOVIE_GENRE의 항목 #)를해야합니다 원하는 것 같다 쿼리 반면. 당신은 아마 그 질문을 그대로두고 약간의 후 처리를하는 것이 나을 것입니다.

고려 : 당신은 별도의 데이터베이스 작업없이 원하는대로 $ 결과를 정확하게 볼 것이다, 그 후

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']); 
} 

:

당신이 그것을 얻을 후

, 그냥 같은 것을 통해 (예를 들어 $result) 배열하여 결과를 실행합니다.

편집 : 일부 오타가 수정되었습니다.

+0

그것은 작동 할 것이고 이미 고려해 봤지만 대신 SQL 쿼리에서 수행 할 방법이 있는지 알고 싶습니다. 그냥 불필요한 PHP 코드를 피하기 위해. 그러나 가능하지 않다면 효과가 있습니다. :) – qwerty

+0

@qwerty. 오 그래. 그럼 내 대답의 선택을 취소하는 것이 좋습니다. codeigniter가 이러한 종류의 다중 레벨 배열 생성을 지원하는지 여부를 알 수있는 사람들은 확인 된 것을 읽으면 질문을 읽지 않을 수도 있습니다. – jedwards

+0

오, 맞습니다. 팁 고마워! 몇 분 후에 더 좋은 답변을 한 사람이 없다면 다시 받아 들일 것입니다. – qwerty