0

結合を使用して 2 つのテーブルからユーザーの詳細とプロフィール画像を取得しようとしています。問題は、すべてのユーザーが prof イメージを持っているわけではないため、where 句で if 条件を使用する必要があることです。prof pic を持たないユーザーのデフォルトは 0 です。prof pic 画像 0 は誰にも属さず、残りの prof pic ID は 17 などです。

すなわち

if tb1.user_pic > 0 Then 
  choose their profile image
else 
   choose a default image.

SELECT tb1.user_id , tb1.full_names , tb1.user_email , tb1.user_pic , tb1.userName , 
tb2.img_id , tb2.img_format , tb2.img_by , tb2.img_album
FROM users as tb1
LEFT JOIN images as tb2
ON tb2.img_by = tb1.user_id
WHERE tb1.user_id = '$session_id' && tb2.img_id = tb1.user_pic
ORDER BY tb1.user_id 

上記のクエリは、問題である prof pic を持たないユーザーには結果を返しません。条件付きステートメントが機能する可能性があると考えていましたが、この場合の使用方法がわかりません。

4

2 に答える 2

0

画像から取得するすべての列に対してサブクエリを使用します。そこで join を使用しないでください。

 SELECT tb1.user_id, tb1.full_names, tb1.user_email, tb1.user_pic, tb1.userName, 

        IsNull((select tb2.img_id from images tb2 where tb2.img_id = tb1.user_pic and tb2.img_by = tb1.user_id), 0) AS img_id, 

        IsNull((select tb2.img_format from images tb2 where tb2.img_id = tb1.user_pic and tb2.img_by = tb1.user_id), 'jpg') AS img_format,

        IsNull((select tb2.tb2.img_album from images tb2 where tb2.img_id = tb1.user_pic and tb2.img_by = tb1.user_id), 'default') AS img_album

 FROM users as tb1

 WHERE tb1.user_id = '$session_id'
 ORDER BY tb1.user_id 

MySQL での IsNull(,) の存在またはその構文についてはわかりませんが。プロフィール写真のないユーザーのデフォルトの画像 URL を設定できます。

于 2013-06-09T12:41:38.773 に答える
0

クエリを大幅に簡素化し、おそらく高速化する代替手段を提案したいと思います (ただし、すべての最適化の主張と同様にこれを測定する必要があります)。

ユーザーが参加するときにデフォルトのイメージをユーザーに割り当て、それを上書きできるようにすることを検討してください。そうすれば、すべてのユーザーは、構成したかどうかに関係なく、まったく同じ方法で抽出できる画像を取得できます。

また、何百万ものユーザーを計画している場合を除き、スペースの要件は面倒ではありません。

技術的には 3NF に違反する可能性がありますが、実際の画像が選択されたかどうかを示すフィールドをテーブルに維持することはできます。ほとんどの人は気づいていませんが、考えられる問題を理解し/軽減するのであれば、(通常はパフォーマンスや単純化のために) そのようなことをしてもまったく問題ありません。

于 2013-06-09T12:15:04.033 に答える