2016-07-07 5 views
0

Ich habe eine Abfrage wie folgt aus:Warum SUM() gibt NULL zurück, wenn keine Zeile ausgewählt ist?

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

SUM() Rückkehr NULL wenn jetzt Zeile ausgewählt ist. Ich meine, wenn :id nicht in der mytable existiert, ist das Ergebnis num_dayNULL. Basierend auf meinen Bedürfnissen sollte es NULL überhaupt nicht sein. Es sollte 0 oder mehr sein.

Wie auch immer, wie kann ich die Anzahl der wahrheit einer Bedingung berechnen? Hier ist die Bedingung:

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

- Weil * die Summe einer leeren Menge * nicht definiert und/oder unsinnig ist. – deceze

+0

@deceze Ok, was ist der beste Weg, in diesem Fall '0' anstelle von' null' zu erhalten? –

Antwort

2

Die einfachste Sache ist, es zu wickeln mit einem ifnull() ein 0 im Fall von null

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

Ja oder 'COALESCE()'. Aber eigentlich will ich wissen, kann ich das mit 'count()' anstelle von 'sum()' machen? –

+0

Ja, sehen Sie sich die Antwort von @bukko – Ray

+0

Vielen Dank ... upvote –

2

zurückzukehren Ist das, was Sie meinen?

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

SUM() den Wert null zurück, wenn es nichts zu addieren. COUNT wird die tatsächliche Zahl oder 0 zurückgeben, wenn keine vorhanden ist.

+1

Dies ist eine sehr gute Lösung. Die Abfrage kann einen Index für 'mytable (user_id, date_time)' nutzen. –

+0

Danke .. upvote –

+0

Nun, hier ist [meine Abfrage] (https://gist.github.com/anonymous/0b2b48e8f6ea7dd2a6e7e53e521f0b29) in der Realität, kann ich das schreiben, wie Sie vorgeschlagen? –

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 

Verwenden Sie Abfrage wie folgt.

+1

Können Sie Ihre Abfrage als Code formatieren? – trincot

+0

Ich antworte von Mobile, also habe keine Schlafmöglichkeiten, kannst du bitte, ich werde bearbeiten. –

+0

Es gibt immer noch 'NULL' zurück, wenn keine Zeile ausgewählt ist. –

1

Wie kann ich die Anzahl der Wahrheiten einer Bedingung berechnen? Hier ist die Bedingung: "Warum ist es` NULL`"

Verwenden CASE innerhalb des bedingten SUM

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

Immer noch gibt es 'NULL' wenn keine Zeile ausgewählt ist. –

+0

Ich denke, Sie müssen diesen "CASE" außerhalb der 'SUM()' verwenden. –

+0

Nein, in diesem Fall müssen Sie 'IFNULL' oder' COALESCE' hinzufügen, Der Unterschied zwischen dieser und der @bukko Lösung ist .... wenn Sie ein anderes bedingtes 'COUNT (*)' brauchen, können Sie es nicht auf '' setzen WO "...Zum Beispiel 'SUM (Monat = Januar), SUM (Monat = Februar)' –