2017-05-24 13 views
1

"Accounts"と "Images"という2つのテーブルがあります。mysqlの結合結果をPHPの多次元配列に含めるには

イメージには、各アカウントごとに複数の結果が含まれます。

mysqlとphpを使用してアカウントに関連付けられたすべての画像を単一の配列に反映させるには、すべての画像をコンマで区切ります。

私はどちらかを使用して参加している特定のではないよ...ここ

は、私は私の最終的な結果があることを期待するものである:ここでは

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [firstName] => "John" 
      [lastName] => "Doe" 
      [images] => "image1.jpg,image2.jpg,image3.jpg" 
     ) 

) 

は、私は現在、得るものです:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [firstName] => "John" 
      [lastName] => "Doe" 
      [filename] => "image1.jpg" 
     ) 

) 

ここまで私のコードです:

$sql = SELECT a.firstName,a.lastName,i.fileName FROM accounts a INNER JOIN images i ON a.id = i.accountID; 

$result = mysqli_query($con,$sql); 

while($row = mysqli_fetch_assoc($result)){ 
     $accounts[] = $row; 
} 

print_r($accounts); 

私が上記のコードを使用するよりも良い方法があれば、私はすべての提案について開いています。

+0

これは、ファイル名を文字列に保存するのには適していません。それらのファイルの1つに '、'があると問題になります。 – ICE

答えて

4

単一のSQLクエリとGROUP_CONCAT関数を使用して、必要な出力を実現できます。

以下は、すべてのアカウント(画像あり/なし)とコンマ区切りの画像ファイル名のリストを検索します。

画像があるアカウントのみを検索する場合は、INNER JOINの場合はLEFT JOINと変更してください。

SELECT a.id, a.firstName, a.lastName, GROUP_CONCAT(i.fileName SEPARATOR ',') AS images 
FROM accounts a 
LEFT JOIN images i ON (a.id = i.accountID) 
GROUP BY a.id 
1

基本的には、結合テーブルから複数の行を連結して文字列にする方法を探しています。いくつかの解決法がありますが、データベースに固有のものです - これはインスピレーションのための答えを確認することができます - How to create a SQL Server function to "join" multiple rows from a subquery into a single delimited field?

しかし、おそらく簡単な方法は結果をPHPコードで組み合わせることです。これは、アカウントごとに重複したデータが返されるため、パフォーマンスが低下しますが、わずかな数の列を選択するだけではそれほど重要ではありません。

コードは次のようになります。

$sql = 'SELECT a.id,a.firstName,a.lastName,i.fileName FROM accounts a INNER JOIN images i ON a.id = i.accountID'; 

$result = mysqli_query($con,$sql); 

while($row = mysqli_fetch_assoc($result)){ 
    if (!isset($accounts[$row['id']])) { 
     $accounts[$row['id']] = $row; 
    } else { 
     $accounts[$row['id']]['fileName'] .= ',' . $row['fileName']; 
    } 
} 

print_r($accounts); 

注、このコードは、アカウントIDを一致するキーを持つ配列$アカウントを作成します。単純な連続番号がキーとして必要な場合は、ループの後に$accounts = array_values($accounts);を追加します。

+0

私に次の結果を与えてくれてありがとう。それはcsvのすべての画像を入れて、SQLクエリから返されるすべてのアカウントではなく、私にアカウントを1つだけ与えました。 ' アレイ( [0] =>配列 ( [ID] => 1 【のfirstName => "ジョン" [名] => "ドウ" [ファイル名] =>「image1.jpg image2、jpg、image3、image4.jpg、image11.jpg、image20.jpg " ) )' – user1157800

+0

この 'array_values'呼び出しを追加しましたか?それなしで試してみてください。また、私はクエリを修正し、 'a.id'を選択した列に追加しました。最後に、画像がないアカウントを含めてすべてのアカウントを取得する必要がある場合は、INNER JOINをLEFT JOINに置き換えてください。 – astax

関連する問題