2016-11-25 125 views
2

我有以下查詢,其中加入了幾個表。其中之一是profile_img。此表格中包含上傳用戶的個人資料圖片,否則會給出profile_images/default.jpg並且用戶不在profile_img表格中,所以我需要進行排序以檢查他們是否不在該表格中,然後設置其個人資料圖像作爲默認值。在SQL查詢中使用else 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()的正確的,但有需要一種其它修復這就是。

在你的where子句中,你引用了p.id =。由於當用戶沒有profile_img行時,p將爲空,因爲比較爲null,整個行將被排除在結果之外。

該查詢考慮了空p.id字段,並且無論如何通過允許p.id爲空來包含它們。現在,p.image_url將爲空,並且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

謝謝。這個伎倆。你能告訴我爲什麼infull能夠工作嗎?什麼是推理? – Paul

+1

ifnull與coalesce一樣,在測試的字段爲空時返回不同的值。在這種情況下,對於沒有圖像的用戶,字段p.image_url爲null,因此它返回'default.png'。在功能上它相當於:當p.image_url爲空然後是'default.png'的情況。else p.image_url以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或第一個必須是RIGHT JOIN,因爲p表是事後的 – Mihai