выбор количества зарегистрированных пользователей из каждого месяца в году, но изменение значения временной метки дает неверный счет - PullRequest
1 голос
/ 13 апреля 2020

Привет! Написал запрос для подсчета количества зарегистрированных пользователей за все месяцы в году.

SELECT MONTH(c1.created_on) AS MONTH, 
     (SELECT COUNT(c2.id)
      FROM register AS c2
       WHERE c2.created_on <= (DATE_FORMAT(DATE_ADD(c1.created_on,
                                                        INTERVAL 1 MONTH),'%Y-%m-01'))) 
       AS registeruser
FROM (SELECT 3 AS mon UNION 
  SELECT 4 AS mon UNION 
  SELECT 5 AS mon
 ) AS m LEFT JOIN
 register AS c1
 ON  MONTH(c1.created_on) = m.mon
GROUP BY MONTH(c1.created_on) 

Итак, тип данных столбца созданного_дона - DateTime, а значение по умолчанию, которое я установил, - CURRENT_TIMESTAMP, поэтому, когда я регистрирую пользователя текущий месяц - апрель, и я добавляю 4 значения, после чего я изменяю месяц 1 пользователя на марш и выполняю запрос, который дает мне счет за месяц апрель как 4 и марш за 1. Здесь я сталкиваюсь с проблемой за апрель, но она дает мне 4, которое должно быть 3 enter image description here enter image description here

Здесь на рисунке я изменил данные , но, посмотрев на него, вы поймете, что в апреле число, которое он показывает как 4, происходит только тогда, когда я меняю метку времени после добавленной записи

1 Ответ

2 голосов
/ 13 апреля 2020

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

WHERE c2.created_on <= DATE_FORMAT(..... 

Вы должны сгруппировать по m.mon, а не по MONTH(c1.created_on), потому что MONTH(c1.created_on) может быть null, если месяц не существует и нет необходимости в подзапросе:

SELECT 
  m.mon AS MONTH, 
  COUNT(c1.created_on) AS registeruser
FROM (
  SELECT 3 AS mon UNION 
  SELECT 4 AS mon UNION 
  SELECT 5 AS mon
 ) AS m 
LEFT JOIN register AS c1
ON  MONTH(c1.created_on) = m.mon
GROUP BY m.mon
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...