2010-11-20 5 views
2

私はPHPでcodeigniterを使用してムービーアーカイブスクリプトをコーディングしています。私はIMDbから映画の情報を取得して、私のデータベースに追加しています。リンクと呼ばれる別のテーブルを使用して選択した映画のリンクを追加します。各行の別のテーブルからの配列としての配列の結合

これは私がデータベースから映画を取得するために使用していますクエリです:

$movies = $this->db->query("SELECT * 
    FROM movies 
    ORDER BY ".$order['by']." ".$order['type']." 
    LIMIT ".$limit.", " . $this->config->item('moviePerPage') 
); 

をし、私はこのようなビューファイルでそれをフェッチしています:

foreach ($movies->result() as $row) { 
    echo $row->name; 
} 

は今リンクがために示されなければなりません一致したIDを持つ各ムービー(ムービーは複数のリンクを持つことができます)。私のリンクテーブルには、「id」、「movieid」、「name」、「link」の各列があります。

単一のMySQLクエリで各ムービーのリンクを取得するにはどうすればよいですか?現在の$ rowムービーに関連するすべてのリンクを取得し、それらを配列として1つの変数にバインドすることは可能ですか? foreach()でループして各ムービーのリンクを表示することができます。

btw:movies.movi​​eidとlinks.movi​​eidの列は同じデータを持ちます。

答えて

3

私はあなたがこのような何かMySQLのGROUP_CONCAT

が必要だと思う: - あなたはすべての映画のためにリンクのカンマ区切りのリストを取得します

SELECT 
    movies.*, 
    group_concat(links.link ', ') as links 
FROM movies 
LEFT JOIN links 
ON links.movieid = movies.movieid 
GROUP BY movies.movieid 

を。あなたは、このように抽出することができます : -

foreach ($movies->result() as $row) { 
    $linksArray = explode(",",$row->links); 
} 

アップデート 私は、これはあなたが複数のリンクを持つ単一の映画のために複数の結果行をせずに結果を得ることができる唯一の方法だと思います。

結果に表示される文字の最大長(デフォルトは1024文字)に注意してください。この制限を無効にする方法を知るには、 Mysql group_concat_max_lengthGroup concat max lengthをお読みください。

Dan Grossmanのように、リンクにカンマが含まれていると思われる場合は、別のまたは珍しい区切り文字を使用してください。

+0

リンクにカンマを使用できます。あなたがやっていることはSQLに属していません。データ構造の作成とロジックの表示は、アプリケーションに属します。 –

+0

@Dan Grossman - カンマが問題である場合、他のいくつかの珍しい区切り文字を '%% @@ && @@ %% 'のように使用できます。どのようにSQLに属しませんか? group_concatはmysql節で、このように使用されます。私はここに私の答えを課すのではなく、これに間違っている。ユーザーは落とし穴に注意する必要があります。それだけです。 –

+0

クエリを正常に実行するには ''、 ''の前に 'SEPARATOR'を使用しなければなりませんでした。 [doc](http://dev.mysql.com/doc/refman/5.0/ja/group-by-functions.html#function_group-concat)を参照してください。 –

0

質問名と同様に、2つのテーブルに参加してください。

SELECT 
    movies.*, 
    links.* 
FROM movies 
LEFT OUTER JOIN links 
ON links.movieid = movies.movieid 
... 

ムービーリンクペアごとに1つの行が表示されます。ムービーのリンクがない場合は、ムービー情報だけの行と、リンクテーブルに対応する列のNULLが取得されます。

これらの結果をループして、ムービーのキーを付けた配列に各ムービーのリンクを配置することができます。

+0

私は試しましたが、1つの問題が発生しました。そのムービーに関連するリンクが2つある場合、同じムービー配列が2つ作成されています。 $ movie ['name']、$ movie ['movieid']、$ movie ['links'] [0,1 ...] ['name'] – Valour

+0

@Spelljack、私の答えをチェックしてください。そうすれば、ムービーに複数のリンクがあっても、すべてのムービーに対して1つの結果が得られます –

+0

これは問題ではありません。これがリレーショナルデータベースの仕組みです。必要な配列に変換するコードを記述する必要があります。 –

関連する問題