2016-11-25 5 views
2

次のクエリでは、いくつかのテーブルを結合します。これらのテーブルの1つはprofile_imgです。このテーブルには、アップロードしたユーザーのプロフィール画像が格納されています。それ以外の場合はprofile_images/default.jpgと表示され、ユーザーはprofile_imgテーブルには含まれていないため、そのテーブルにないかどうかを確認して、イメージをデフォルトとして使用します。SQLクエリでelseを使用する

ここは私の質問です。

SELECT f.*, u.*, p.* 
    FROM friends f 
    LEFT JOIN 
     profile_img p 
     ON p.user_id = f.friend_one 
    JOIN 
     users u 
     ON u.id = f.friend_one 
    WHERE f.friend_two = ? AND f.status = ? AND 
     p.id = (select max(p2.id) from profile_img p2 where p2.user_id = p.user_id) 

は、私が試してみて結果を得るために,coalesce(p.img, 'profile_images/default.jpg') as imgを試してみましたが、それは助けにはなりませんでした。別のクエリで

(case when p.img <> '' then p.img 
else 'profile_images/default.jpg' 
end) as img 

私はちょうどそれがこのケースで動作するように、それはこのために動作しません取得する方法がわからないです。

答えて

1

@marekfulを使用すると、IFNULL()を使用することで正しいですが、必要に応じて一つの他の修正プログラムのthatsがあります。

where句では、p.id =を参照しています。そのユーザーのprofile_img行がない場合、pはnullになるため、nullとの比較のために行全体が結果から除外されます。

このクエリでは、null p.idフィールドを考慮に入れて、とにかくp.idにnullを指定することでそれらを含めることができます。 p.image_urlはnullになり、ifnull()メソッドはこれらの行に対して 'default.png'で応答します。

SELECT f.*, u.*, p.*, IFNULL(p.image_url, 'default.png') AS profile_pic 
FROM friends f 
LEFT JOIN 
    profile_img p 
    ON p.user_id = f.friend_one 
JOIN 
    users u 
    ON u.id = f.friend_one 
WHERE 
    f.friend_two = ? 
    AND f.status = ? 
    AND (p.id is null or p.id = (select max(p2.id) from profile_img p2 where p2.user_id = p.user_id)) 

また、ON述語にサブクエリを追加することにより、OR句なしでこれを行うことができるかもしれません。サブクエリは、結合の前に解決されます。

SELECT f.*, u.*, p.*, IFNULL(p.image_url, 'default.png') AS profile_pic 
FROM friends f 
JOIN 
    users u 
    ON u.id = f.friend_one 
LEFT JOIN 
    profile_img p 
    ON p.user_id = f.friend_one and p.id = (select max(p2.id) from profile_img p2 where p2.user_id = p.user_id)  
WHERE 
    f.friend_two = ? 
    AND f.status = ? 

パフォーマンスが優れているかどうかはわかりません。あなたはそれを自分で試してみる必要があります。

+0

ありがとう。これはトリックでした。どうしてあなたがなぜ働いているのか教えてください。推論は何ですか? – Paul

+1

ifallは、coalesceのように、テスト対象のフィールドがnullの場合に別の値を返します。この場合、p.image_urlフィールドはイメージを持たないユーザーのためにnullなので、代わりに 'default.png'を返します。機能的には次のようになります:p.image_urlがnullの場合、 'default.png' else p.image_url end as profile_pic – serverSentinel

1

値が条件付きで設定されるフィールドを選択することができます。 IFNULL()

SELECT f.*, u.*, p.*, IFNULL(p.image_url, 'default.png') AS profile_pic 
FROM friends f 
LEFT JOIN 
    profile_img p 
    ON p.user_id = f.friend_one 
JOIN 
    users u 
    ON u.id = f.friend_one 
WHERE f.friend_two = ? AND f.status = ? AND 
    p.id = (select max(p2.id) from profile_img p2 where p2.user_id = p.user_id) 
+0

私は 'IFNULL(p.img、 'profile_images/default.jpg')AS profile_pic'に変更しましたが、運はありません。 – Paul

+0

他のJOINもLEFT JOINでなければならないかもしれません。あるいは、Pテーブルが後であるので、最初は右ジョインでなければなりません – Mihai

関連する問題