2016-02-10 101 views
4

我希望能夠返回0當我正在做一個計數,我最好不使用連接,因爲我的查詢不使用它們。在SQL計數查詢中包含零?

這是我的查詢。

SELECT count(user_id) as agencyLogins, 
     DATE_FORMAT(login_date, '%Y-%m-%d') as date 
FROM logins, users 
WHERE login_date >= '2015-02-10%' AND login_date < '2016-02-11%' 
AND logins.user_id = users.id 
GROUP BY DATE_FORMAT(login_date,'%Y-%m-%d') 

它所做的是統計用戶登錄網站的次數。 它不計算零,但我想知道什麼時候沒有登錄。

回答

4

請在未來嘗試使用顯式連接,更具可讀性並且會使您避免此錯誤。你需要的是一個左連接:

SELECT t.id,count(s.user_id) as agencyLogins, DATE_FORMAT(s.login_date, '%Y-%m-%d') as date 
FROM users t 
LEFT OUTER JOIN login s 
ON(t.id = s.user_id) 
WHERE (s.login_date >= '2015-02-10%' AND s.login_date < '2016-02-11%') or (s.user_id is null) 
GROUP BY t.id,DATE_FORMAT(s.login_date,'%Y-%m-%d') 
+0

我收到一個錯誤 - '字段列表'中的未知列't.user_id'我不知道爲什麼這不起作用。 (我的SQL知識不是很好) – Kieron606

+0

@ Kieron606 Sry,認爲列名是user_id,它的實際ID,所以現在查詢將起作用。 – sagi

+1

您需要COUNT(s.id)而不是COUNT(*)。因爲您需要用戶的登錄次數,而不是行數(即,如果用戶未登錄1行仍將返回,因此計數在當前解決方案中爲1)。 – Kickstart

1

我覺得SQL對你有用。 2015-02-10%請刪除該字符串中的%符號。

SELECT IF(COUNT(user_id) IS NULL,'0',COUNT(user_id)) as agencyLogins, DATE_FORMAT(login_date, '%Y-%m-%d') as date FROM users left join logins on logins.user_id = users.id 
    WHERE date(login_date) >= date('2015-02-10') AND date(login_date) <= date('2016-02-11') 
GROUP BY DATE_FORMAT(login_date,'%Y-%m-%d') 
+0

那不是他提出的要求。 – sagi

+0

這實際上是有用的,並改進了我的SQL查詢,但不是我所要求的。 – Kieron606

+0

我修改了SQL請檢查它。 –

1

這可能會幫助你

SELECT SUM(agencyLogins), date FROM (
    SELECT count(user_id) as agencyLogins, 
      DATE_FORMAT(login_date, '%Y-%m-%d') as date 
    FROM logins, users 
    WHERE login_date >= '2015-02-10%' AND login_date < '2016-02-11%' 
    AND logins.user_id = users.id 
    GROUP BY DATE_FORMAT(login_date,'%Y-%m-%d') 


    UNION ALL 

    SELECT 0,'' 
    ) AS A 
    GROUP BY DATE 
+0

這隻能返回0次一次。 – Kieron606