即使

2016-11-29 22 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