0

写真も検索結果に表示したい。アバター写真だけでなく、3枚の写真。写真は追加のテーブルuser_photosにあります。ユーザーごとに1行を取得する場合、答えは明確になります-内部結合。ただし、ユーザーごとに複数行を取得します。

私が使用できる最初の方法は結合です:

SELECT * FROM users INNER JOIN photos ON photos.user_id=users.user_id

この場合、結果を同じuser_idとマージするために、追加のphpコードが必要です。このようなもの:

foreach($results as $result){
  if(isset($user[$result['user_id']]['age'])){
    $user[$result['user_id']]['photos'][] = $result['photo'];
    continue;
  }      
  $user[$result['user_id']]['age'] = $result['age'];
  $user[$result['user_id']]['photos'][] = $result['photo'];
  //...
}

次に、ビューでは、ユーザーの最初のレベルループが必要であり、次に各ユーザーの$ user [$ result['user_id']]['photos']配列の2番目のレベルループが必要です。

または、結果のサブクエリごとに使用できます。どのオプションもエレガントに見えないので、他に方法があるのではないかと思います。そうでない場合は、おそらく最初のオプションが進むべき方法ですよね?

4

3 に答える 3

2

元の質問の場合、最初のオプションは通常、データベースに不必要に送信されるクエリの数を減らすための方法です。

しかし、私はダウズの答えを好みます。それはほとんどそこにあると思います。LEFT JOIN私が行う1つの変更は、写真を持たないユーザーが引き続きクエリ結果に返されるように結合を作成することです。そのため、クエリを次のように更新します。

select u.*, group_concat(photos.name SEPARATOR ' & ') as name
from users u
     join photos on photos.user_id=u.user_id
group by u.user_id;

次の行に沿って結果を返します:

+-------------------------------------+
|user_id   |photo                     |
+----------+--------------------------+
|1         |photo1 & photo2 & photo7  |
+----------+--------------------------+
|2         |                      NULL|
+----------+--------------------------+
|3         |photo3 & photo5           |
+-------------------------------------+
于 2012-07-12T08:40:50.073 に答える
1

GROUP_CONCATを使用したいので、次のようになります。

select u.*, group_concat(photos.name SEPARATOR ' & ') as photonames
from users u
     join photos on photos.user_id=users.user_id
group by a.user_id;

explode()次に、を使用してアレイを解凍できます。

于 2012-07-12T08:31:44.873 に答える
1

最初のオプションは進むべき道であり、ユーザーデータを複数回取得しているという事実にもかかわらず(一致する画像ごとに返されます)、2番目のオプションよりもはるかに効率的です。

2番目のオプションは、データベースに実行する作業がはるかに多くなり、スクリプトとDBの間のトラフィックが非常に大きくなるため、非常に非効率的です。

実際には、このような状況で実装できるGROUP BYことを以前に示した3番目のオプションがあります。これは、写真情報を、およびを使用してPHPでデコードできるベクトルを表すスカラー値に変換することですGROUP_CONCAT()(これにはJSONを使用しました過去)ですが、お勧めとは言えませんが、よろしければ説明します。

于 2012-07-12T08:34:19.517 に答える