MySQL Group by с нулевым счетчиком и Left Outter Join - PullRequest
0 голосов
/ 03 января 2019

У меня есть запрос ниже, чтобы зарегистрировать пользователей на определенный день, который работает, кроме случаев, когда количество регистраций пользователей для этого дня равно нулю, я хочу, чтобы оно отображалось как нулевое число.Однако, похоже, что эта запись пропущена,

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;

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Другое решение:

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;
0 голосов
/ 03 января 2019

Проблема возникает из JOIN: это LEFT JOIN, что вам нужно, но тогда предложение WHERE относится к соединяемой таблице: в результате это ведет себя как INNER JOIN .

Чтобы решить эту проблему, необходимо переместить условия в объединенной таблице из условия WHERE в предложение ON JOIN.

Изменить это:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...