2016-11-29 4 views
2

ich die folgende Abfrage verwenden:Rückgabewert, auch wenn ein Eintrag existiert nicht

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 

jedoch eine Reihe in shop_entrys könnte in shop_images ohne Verbindung zu einer Reihe vorhanden ist. So, ... WHERE shop_entrys.id = shop_images.s_id ... wird nicht erfüllt werden. In diesem Fall möchte ich immer noch ein Ergebnis zurückgeben. Zum Beispiel:

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

Wie soll ich die obige Abfrage ein Ergebnis noch zurückkehren ändern?

+0

Verwenden Sie ein LEFT OUTER JOIN – Kickstart

+0

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

Antwort

4

Mit einem LEFT OUTER JOIN mit COALESCE einem Standardwert in der 2. Säule geben

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

Verwenden Sie ein LEFT JOIN und 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 

Bitte vermeiden implizite Join-Syntax verwenden (durch Komma getrennt), da es veraltet ist und chaotisch und eine Menge Zeit führt zu Fehlern. Verwenden Sie nur die richtige Syntax eines Joins!

+0

Danke, können Sie mir sagen, warum ich nicht implizite Join-Syntax verwenden sollte? So habe ich es in der Schule gelernt. – Bobface

+2

Nun, der Grund ist sichtbarer und klarer, wenn Sie mehrere Tabellen verbinden. Versuchen Sie, eine Abfrage zu verstehen, die 7 Tabellen mit impliziter Joinsyntax verbindet, für immer. Ein weiterer Grund ist der 'LEFT JOIN' mit impliziter Joinsyntax, der es noch komplizierter und einschränkender macht (eine Tabelle kann nur mit einer Tabelle verbunden sein) ETC) . @Bobface – sagi

+2

@Bobface - ein weiteres Problem, das zu Problemen führen kann, wenn Leute implizite und explizite Joins mischen, ist, dass sie eine andere Priorität haben. – Kickstart

Verwandte Themen