【问题标题】:MySQL Group by with Zero Count with Left Outter JoinMySQL Group by 零计数和左外连接
【发布时间】:2019-01-03 01:01:47
【问题描述】:

我有以下查询来获取特定日期的用户注册,除了当日用户注册计数为零时,我希望它显示为零计数。但是,它似乎跳过了该条目,

SELECT count( * ) AS total, a.Date AS created_dates
                FROM (

                    SELECT (CURDATE() - INTERVAL c.number DAY) AS date
FROM (SELECT singles + tens + hundreds number FROM 
( SELECT 0 singles
UNION ALL SELECT   1 UNION ALL SELECT   2 UNION ALL SELECT   3
UNION ALL SELECT   4 UNION ALL SELECT   5 UNION ALL SELECT   6
UNION ALL SELECT   7 UNION ALL SELECT   8 UNION ALL SELECT   9
) singles JOIN 
(SELECT 0 tens
UNION ALL SELECT  10 UNION ALL SELECT  20 UNION ALL SELECT  30
UNION ALL SELECT  40 UNION ALL SELECT  50 UNION ALL SELECT  60
UNION ALL SELECT  70 UNION ALL SELECT  80 UNION ALL SELECT  90
) tens  JOIN 
(SELECT 0 hundreds
UNION ALL SELECT  100 UNION ALL SELECT  200 UNION ALL SELECT  300
UNION ALL SELECT  400 UNION ALL SELECT  500 UNION ALL SELECT  600
UNION ALL SELECT  700 UNION ALL SELECT  800 UNION ALL SELECT  900
) hundreds
ORDER BY number DESC) c  
WHERE c.number BETWEEN 0 and 364

    ) a
    LEFT OUTER JOIN `users_tp` u
        ON DATE(u.register) = a.Date
WHERE
    ( a.Date  BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() )
    AND u.origin_reg = 'mobile'
    AND u.step!=5   
GROUP BY a.Date
               ORDER BY a.Date ASC;

【问题讨论】:

    标签: mysql sql datetime left-join where-clause


    【解决方案1】:

    问题来自JOIN:它是LEFT JOIN,这是您想要的,但是WHERE 子句指的是正在连接的表:因此,它的行为类似于INNER JOIN .

    要解决这个问题,您需要将连接表中的条件从WHERE 子句移动到JOINON 子句中。

    改变这个:

    LEFT OUTER JOIN `users_tp` u
        ON DATE(u.register) = a.Date
    WHERE
        ( a.Date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() )
        AND u.origin_reg = 'mobile'
        AND u.step!=5   
    

    收件人:

    LEFT OUTER JOIN `users_tp` u
        ON  DATE(u.register) = a.Date
        AND u.origin_reg = 'mobile'  
        AND u.step!=5
    WHERE
        a.Date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()
    

    【讨论】:

    • 非常感谢,我一直在努力解决这个问题,
    【解决方案2】:

    另一种解决方案:

    SELECT count(register ) AS total,a.date AS created_dates from 
    (SELECT (CURDATE() - INTERVAL c.number DAY) AS date
    FROM (SELECT singles + tens + hundreds number FROM 
    ( SELECT 0 singles
    UNION ALL SELECT   1 UNION ALL SELECT   2 UNION ALL SELECT   3
    UNION ALL SELECT   4 UNION ALL SELECT   5 UNION ALL SELECT   6
    UNION ALL SELECT   7 UNION ALL SELECT   8 UNION ALL SELECT   9
    ) singles JOIN 
    (SELECT 0 tens
    UNION ALL SELECT  10 UNION ALL SELECT  20 UNION ALL SELECT  30
    UNION ALL SELECT  40 UNION ALL SELECT  50 UNION ALL SELECT  60
    UNION ALL SELECT  70 UNION ALL SELECT  80 UNION ALL SELECT  90
    ) tens  JOIN 
    (SELECT 0 hundreds
    UNION ALL SELECT  100 UNION ALL SELECT  200 UNION ALL SELECT  300
    UNION ALL SELECT  400 UNION ALL SELECT  500 UNION ALL SELECT  600
    UNION ALL SELECT  700 UNION ALL SELECT  800 UNION ALL SELECT  900
    ) hundreds
    ORDER BY number DESC) c  
    WHERE c.number BETWEEN 0 and 364)a 
    
    left join 
    
    (SELECT * from users_tp where origin_reg = 'mobile'
        AND step!=5) u
    
    on DATE(u.register) = a.Date
    where
    (a.Date  BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() )
    GROUP BY a.Date
                   ORDER BY a.Date ASC;
    

    【讨论】:

      猜你喜欢
      • 2019-01-15
      • 1970-01-01
      • 2011-02-07
      • 2015-02-28
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      相关资源
      最近更新 更多