2016-07-07 4 views
0

У меня есть запрос, как это:Почему SUM() возвращает NULL, если ни одна строка не выбрана?

SELECT sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day))) as num_day 
FROM mytable 
WHERE user_id = :id 

SUM() возвращение NULL при выборе строки в настоящее время. Я имею в виду, когда :id не существует в mytable, результатом num_day является NULL. Основываясь на моих потребностях, он не должен быть NULL. Это должно быть 0 или больше.

В любом случае, как я могу рассчитать количество истинности условия? Вот условие:

date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day)) 
+0

- Потому что * сумма пустого множества * не определена и/или бессмысленна. – deceze

+0

@deceze Хорошо, что лучший способ получить '0' вместо' null' в этом случае? –

ответ

2

Самое простое, чтобы обернуть его с ifnull() вернуть 0 в случае null

ifnull(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day))), 0) 
+0

Да или 'COALESCE()'. Но на самом деле я хочу знать, могу ли я сделать это с помощью 'count()' вместо 'sum()'? –

+0

Да, посмотрите на ответ от @bukko – Ray

+0

Спасибо ... upvote –

2

ли это то, что вы имеете в виду?

SELECT COUNT(*) AS num_day 
FROM mytable 
WHERE user_id = :id 
AND date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day)) 

SUM() вернет null, если нечего добавить. COUNT вернет фактическое число, или 0, если нет.

+1

Это очень хорошее решение. Запрос может воспользоваться индексом на 'mytable (user_id, date_time)'. –

+0

Спасибо .. upvote –

+0

Ну вот [мой запрос] (https://gist.github.com/anonymous/0b2b48e8f6ea7dd2a6e7e53e521f0b29) в реальности, могу ли я написать это, как то, что вы предложили? –

0
SELECT sum(if(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day))),1,0) as num_day 
FROM mytable 
WHERE user_id = :id 

Использовать такой запрос.

+1

Не могли бы вы отформатировать свой запрос в виде кода? – trincot

+0

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

+0

Он по-прежнему возвращает 'NULL', когда ни одна строка не выбрана. –

1

Как я могу рассчитать количество истинности условия? Вот условие: "? Почему это` NULL`"

Использование CASE внутри условного SUM

SELECT sum(CASE WHEN date_time > unix_timestamp(DATE_SUB(now(), 
                  INTERVAL 1 day)) 
         THEN 1 
       ELSE 0 
      END 
     ) as num_day 
+0

Тем не менее он возвращает 'NULL', когда ни одна строка не выбрана. –

+0

Я думаю, вы должны использовать эту 'CASE' вне' SUM() '. –

+0

Нет, в этом случае вам нужно добавить 'IFNULL' или' COALESCE'. Разница между этим и решением @bukko заключается в .... если вам нужен другой условный 'COUNT (*)', вы не можете поместить его на ' ГДЕ ...Например, 'SUM (месяц = ​​январь), SUM (месяц = ​​февраль)' –