2015-01-06 27 views
0

所以这里的计数是我的查询:MYSQL包括列w。 0

SELECT 
    COUNT(user_id) AS `Records` , 
    DATE(FROM_UNIXTIME(`tstamp`)) AS `Date` 
FROM `user` 
WHERE FROM_UNIXTIME('tstamp') >= '2014-11-00' 
GROUP BY DATE(FROM_UNIXTIME(`tstamp`)) 
LIMIT 200 

的问题是它只返回行,其中记录大于0的计数有没有一种方法,包括日期,其中计数= 0?

+1

你需要有一个日历表,也留下了日历表连接来获得与零计数行。 – radar

回答

1

您可以生成自己的日历表中的子查询

SET @start_date = '2014-11-01'; 
SELECT MyData.dt,IFNULL(MyData.Records,0) Records FROM 
(
    SELECT dt FROM 
    (SELECT num,(@start_date + INTERVAL num DAY) dt FROM 
    (SELECT h*100+t*10+u num FROM 
    (SELECT 0 h UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) A, 
    (SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) B, 
    (SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) C) AA) AAA 
    WHERE dt <= DATE(NOW()) 
    ORDER BY num 
) Calendar LEFT JOIN 
(
    SELECT 
     COUNT(user_id) AS `Records` , 
     DATE(FROM_UNIXTIME(`tstamp`)) dt 
    FROM `user` 
    WHERE FROM_UNIXTIME('tstamp') >= '2014-11-00' 
    GROUP BY DATE(FROM_UNIXTIME(`tstamp`)) 
    LIMIT 200 
) MyData USING (dt); 

试试看!

CAVEAT:此日历子查询仅在999天之前返回。

可以延伸回到9999天这样

SET @start_date = '2014-11-01'; 
SELECT MyData.dt,IFNULL(MyData.Records,0) Records FROM 
(
    SELECT dt FROM 
    (SELECT num,(@start_date + INTERVAL num DAY) dt FROM 
    (SELECT th*1000+h*100+t*10+u num FROM 
    (SELECT 0 th UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Z, 
    (SELECT 0 h UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) A, 
    (SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) B, 
    (SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) C) AA) AAA 
    WHERE dt <= DATE(NOW()) 
    ORDER BY num 
) Calendar LEFT JOIN 
(
    SELECT 
     COUNT(user_id) AS `Records` , 
     DATE(FROM_UNIXTIME(`tstamp`)) dt 
    FROM `user` 
    WHERE FROM_UNIXTIME('tstamp') >= '2014-11-00' 
    GROUP BY DATE(FROM_UNIXTIME(`tstamp`)) 
    LIMIT 200 
) MyData USING (dt); 
+0

你是一位了不起的先生。 idk是否完全解决了我现有的问题,但它给了我一些关于如何让事情有点不同的想法。感谢您花时间把这些放在一起。 – ChuckKelly

+0

我要更新我的答案,使其显示为零(我忘了那部分) – RolandoMySQLDBA