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

Используйте LEFT OUTER JOIN – Kickstart

+0

[ 'COALESCE'] (http://dev.mysql.com/doc/ RefMan/5.7/о/сравнение-operators.html)? –

ответ

4

Используя левое внешнее соединение с COALESCE, чтобы дать значение по умолчанию, на 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 JOIN и COALESCE():

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» с синтаксисом неявного соединения, что делает его еще более сложным и делает ограничения (таблица может быть внешней, соединенной только с одной таблицей И Т.Д) . @Bobface – sagi

+2

@Bobface - еще одна проблема, которая может вызвать проблемы, когда люди смешивают неявные и явные соединения, так это то, что они имеют другой приоритет. – Kickstart

Смежные вопросы