即使

2016-11-29 23 views
2

我使用下面的查詢的條目不存在返回值:即使

SELECT shop_entrys.id, shop_images.path FROM shop_entrys,shop_images 
WHERE shop_entrys.id = shop_images.s_id AND 
shop_images.pos = 0 AND 
shop_entrys.category_id = 1 
ORDER BY shop_entrys.pos ASC 

然而,在shop_entrys行可能與shop_images沒有聯繫到行存在。因此,... WHERE shop_entrys.id = shop_images.s_id ...將不會被滿足。在這種情況下,我仍然想返回結果。例如:

shop_entrys.id shop_images.path 1 "/img1.jpg" ... ... 42 "not found"

我應該如何改變上述查詢仍返回一個結果?

+0

使用左外連接 – Kickstart

+0

['COALESCE'](http://dev.mysql.com/doc/ refman/5.7/EN /比較-operators.html)? –

回答

4

使用LEFT OUTER JOIN與合併成一個默認值,以與第2列

SELECT shop_entrys.id, COALESCE(shop_images.path, 'NOT FOUND') 
FROM shop_entrys 
LEFT OUTER JOIN shop_images 
ON shop_entrys.id = shop_images.s_id AND shop_images.pos = 0 
WHERE shop_entrys.category_id = 1 
ORDER BY shop_entrys.pos ASC 
3

使用LEFT JOINCOALESCE()

SELECT shop_entrys.id, 
     COALESCE(shop_images.path,'NOT FOUND') 
FROM shop_entrys 
LEFT JOIN shop_images 
ON(shop_entrys.id = shop_images.s_id AND 
    shop_images.pos = 0) 
WHERE shop_entrys.category_id = 1 
ORDER BY shop_entrys.pos 

請避免使用隱式連接語法(逗號分隔),因爲它已過時,雜亂,很多時候會導致錯誤。僅使用加入的正確語法!

+0

謝謝,你能告訴我爲什麼我不應該使用隱式連接語法嗎?這是我在學校學到的方式。 – Bobface

+2

好吧,加入多個表格的原因更明顯,更清晰。試着理解一個查詢,它使用隱式連接語法連接7個表,並且需要永遠保留。另一個原因是帶有隱式連接語法的'LEFT JOIN',這使得它更加複雜並且造成了限制(一個表可以僅外連接到一個表ETC)。 @Bobface – sagi

+2

@Bobface - 當人們混合隱式和顯式連接時,會導致問題的另一個問題是它們具有不同的優先級。 – Kickstart