2016-05-10 2 views
0

Это возвращает несколько строк:MAX() не возвращает NULL строки из 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 

Но это будет возвращать только строки, где есть предложение в keywords_bids:

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 

Как я получаю его, чтобы вернуть MAX(b.bid_per_visit), если есть ставка, и ноль, если нет ставок.

Не исключая строки из оригинального LIKE-поиска в основном.

+0

Ваш второй запрос вернет одну строку – Mihai

+0

, что представляет собой объект назначения? –

+0

@Mihai это то, чего я пытаюсь избежать. Я пытаюсь получить список максимальных ставок для разных ключевых слов из таблицы keywords_words. –

ответ

2

Использование COALESCE:

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

Или не группируют по и просто:

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

coalesce() возвращает первое ненулевое значение в списке значений. При левом соединении для таблицы joiner возвращаются нули, нет соответствующей строки.

0

использование IFNULL (MAX (b.bid_per_visit), 0) решить вашу проблему, которая вернет 0, если MAX (b.bid_per_visit) имеет значение null и возвращает максимум b.bid_per_visit, если его значение не равно нулю.

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