2016-05-10 11 views
0

Dies wird mehrere Zeilen zurückgeben:MAX() kehrt nicht NULL Zeilen von LEFT JOIN

SELECT w.word_id, w.word_word, w.word_visits, w.word_created_unix, b.bid_per_visit 
FROM keywords_words AS w 
LEFT JOIN keywords_bids AS b 
ON w.word_id = b.bid_word_id WHERE w.word_word LIKE 'an%' 
ORDER BY w.word_visits DESC 
LIMIT 10 

Aber dies wird nur Zeilen zurück, wo es ein Gebot in keywords_bids ist:

SELECT w.word_id, w.word_word, w.word_visits, w.word_created_unix, MAX(b.bid_per_visit) 
FROM keywords_words AS w 
LEFT JOIN keywords_bids AS b 
ON w.word_id = b.bid_word_id WHERE w.word_word LIKE 'an%' 
ORDER BY w.word_visits DESC 
LIMIT 10 

Wie bekomme ich es, um die MAX(b.bid_per_visit) wenn es ein Gebot gibt, und Null, wenn es keine Gebote gibt.

Nicht unbedingt Zeilen aus der ursprünglichen LIKE Suche im Grunde genommen.

+0

Ihre zweite Abfrage gibt eine einzelne Zeile zurück – Mihai

+0

Was ist die Gebotseinheit hier? –

+0

@Mihai das ist was ich versuche zu vermeiden. Ich versuche, eine Liste der maximalen Gebote für verschiedene Keywords aus meiner keywords_words-Tabelle zu erhalten. –

Antwort

2

Verwendung coalesce:

... 
MAX(coalesce(b.bid_per_visit, 0)) 
... 

Oder Gruppe nicht durch und einfach:

... 
coalesce(b.bid_per_visit, 0) 
... 

coalesce() gibt den ersten Nicht-Null-Wert in der Liste der Werte. Bei linken Joins werden Nullen für die Joinertabelle zurückgegeben, wenn keine übereinstimmende Zeile vorhanden ist.

0

Verwendung von IFNULL (MAX (b.bid_per_visit), 0) lösen Sie Ihr Problem, das 0 zurückgibt, wenn MAX (b.bid_per_visit) null ist und Maximum von b.bid_per_visit zurückgibt, wenn es nicht null ist.