2016-05-04 9 views
1

Допустит, у меня есть users стола с двумя колонками, id и referer_idMySQL Выберите возврат неверного значения NULL с COUNT

enter image description here

Если пользователь был refered кем-то еще, его реферер будет referer_id. Если он зарегистрировался сам, то referer_id будет NULL

Я хочу рассчитать, сколько упомянутых пользователей у пользователя есть.

У меня есть запрос, как этот

SELECT `referer_id`,count(`referer_id`) FROM `users` 
GROUP BY `referer_id` 

enter image description here

Как вы можете видеть счетчик NULL равен 0, но у меня есть много пользователей, которые не refered никто. Как я могу это решить?

+0

'значения NULL' могут делать странные вещи со сравнениями. Посмотрите, что произойдет, если вы сделаете что-то вроде 'GROUP BY IFNULL (referer_id, -1)'. –

+0

То же самое, NULL по-прежнему 0 – rmths01

ответ

1

Мне это не нравится, я думаю, что там есть более элегантное решение, но оно работает и может помочь вам найти это лучшее решение.

select 
    t1.id, 
    ifnull(t3.ct, 0) 
    from 
    temp t1 
    left join 
     (select 
     t2.referer_id, 
     count(t2.referer_id) as ct 
     from temp t2 
     group by t2.referer_id) t3 
    on t1.id = t3.referer_id; 

С немного больше мысли, вот вариант, который позволяет избежать подзапрос:

select t1.id, ifnull(count(t2.referer_id), 0) 
from temp t1 
left join temp t2 on t1.id = t2.referer_id 
group by t1.id; 
1

Несмотря на то, что я не могу объяснить, что причина вызвала этот вопрос, я понял это другое решение, как это;)

SELECT `referer_id`, 
     if(`referer_id` is null, @num := @num + 1, count(`referer_id`)) as referer_id_cnt 
FROM `users`, (select @num := 0) tmp 
GROUP BY `referer_id` 

Хмм, то, что я написал выше, определенно не является правильным ответом. На самом деле это поможет вам.

SELECT `referer_id`,count(1) FROM `users` 
GROUP BY `referer_id` 

И посмотрите эту ссылку How to count NULL values in MySQL?

+0

«Трюк« COUNT (1) »работал для меня. – Pengxer

0
SELECT `referer_id`,count(NVL(`referer_id`,0)) 
FROM `users` 
GROUP BY `referer_id` 
+0

К сожалению, его вопрос относится к mysql, который не имеет функции NVL. ifnull - эквивалент mysql. Однако, даже если вы выполняете этот запрос w/ifnull, он все равно не возвращает результаты для тех, у кого нет ссылок, чего хочет OP. – ghenghy

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