2012-01-19 14 views
0

私はデータベースからムービーのランダムなリストを生成するためにPHPで次のコードを実行していますが、genereの値は配列であるため、配列の最初の値をキャプチャしています。PHP MYSQLの配列

genereのすべての値をカンマ区切りで取得できるように、クエリを変更するにはどうすればよいですか。

 $q = "SELECT * 
      FROM 
       title 
       INNER JOIN title_genere ON (title.id = title_genere.id_title) 
       INNER JOIN genere ON (title_genere.id_genere = genere.id) 
      ORDER BY RAND() 
      LIMIT 8"; 

$result = mysql_query($q); 
while ($row = mysql_fetch_array($result)) { 

    $id = $row['id']; 
    $title = $row['title']; 
    $year = $row['year']; 
    $poster = $row['poster']; 
    $poster = str_replace("./", "lib/", $poster); 
    $genere = $row['genere']; 

    echo "<div id='a'>"; 
    echo "<div id='b'>".$title.'</div>'; 
    echo "<div id='c'>".$year.'</div>'; 
    echo "<div id='d'><a href='select.php?movieid=$id'><img src='$poster' alt='' border='1' align='center' width='214' height='314' /></a></div>"; 
    echo "<div id='e'>".$genere.'</div>'; 
    echo "</div>"; 
    //var_dump($genere); 
} 
+4

MySQLの[GROUP_CONCAT()]を使用してに見て(http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat ) 関数。 –

答えて

4

この方法を試してください。

$q = "SELECT 
      *, 
      GROUP_CONCAT(CAST(title_genere AS BINARY) SEPARATOR ',') AS generes 
     FROM 
      title 
      INNER JOIN title_genere ON (title.id = title_genere.id_title) 
      INNER JOIN genere ON (title_genere.id_genere = genere.id) 
     ORDER BY RAND() 
     GROUP BY title.id 
     LIMIT 8"; 

これがキーgeneresにgeneresのカンマ区切りのリストを選択する必要があります。詳細はhttp://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

+0

なぜ彼は 'CAST ... AS BINARY'を使うべきですか? – kuboslav

+0

@kuboslav私は自分のプロジェクトのコードを取りました。私はずっと前にインターネット上で見つけました。 'GROUP_CONCAT(title_genere SEPARATOR '、')AS generesは正しいでしょうか? – TimWolla

+0

私はそれが良いと思います - 'CAST'は不要です。 – kuboslav

0

を参照してください。GROUP_CONCAT/GROUP BYを使用しないと、オーバーヘッドが発生します。

まず、8個のランダムタイトル(titlesテーブルのみ)をタイトルIDでインデックスされた連想配列に選択します。それを$ idxと名づけましょう。

次に、$ id変数としてidリストを準備します。

その後、

SELECT 
title_genere.id_title 
, genre.genre 
FROM 
title_genre 
INNER JOIN genre ON title_genere.id_genere = genere.id 
WHERE 
title_genere.id_title IN ($ids) 
ORDER BY 
genre 

と収穫$idxでリストのgenre値クエリを実行します。$ idxをからHTMLを生成し、最後に

$idx[$row['id_title']]['genres'][] = $row['genre'] 

0

並べ替え私は以下のコードを使って私が望むものを生成します。おかげで皆の助けを

SELECT 
     title.id, 
     title.title, 
     GROUP_CONCAT(genere SEPARATOR ' | ') AS genere, 
     title.`year`, 
     title.poster 
    FROM 
     title 
     INNER JOIN title_genere ON (title.id = title_genere.id_title) 
     INNER JOIN genere ON (title_genere.id_genere = genere.id) 
    GROUP BY 
     title.id, 
     title.title, 
     title.`year`, 
     title.poster 
    ORDER BY 
     RAND() 
    LIMIT 8