Подтвердить что ты не робот

Показывать все даты, даже если нет результата

SELECT User_JoinDate, 
COUNT(User_ID) 
FROM Users WHERE `User_JoinDate` 
BETWEEN '2012-11-22' AND '2012-12-06' 
GROUP BY User_JoinDate 
ORDER BY User_JoinDate ASC"

Я генерирую данные, которые будут отображаться в линейном графике. К сожалению, я не могу понять, как получить вышеуказанный запрос для отображения 0 для даты, которую ни один пользователь не мог зарегистрировать. Итак, в настоящее время мой вывод может быть примерно таким:

2012-11-22 - 2
2012-11-25 - 4

Но я хочу

2012-11-22 - 2
2012-11-23 - 0
2012-11-24 - 0
2012-11-25 - 4

В настоящее время у меня есть рабочая версия, которая хранит результат MySQL в массиве, а затем PHP перебирает пробелы и заполняет пробелы. Это кажется очень грязным, и я надеялся, что через MySQL будет решение. У меня был хороший поиск на сайте, но я пытался понять некоторые из реализаций. Какие-либо предложения?

4b9b3361

Ответ 1

Вы можете создать автоматизированный набор результатов с использованием переменных MySQL для всех дат, которые вы хотите.

select
      AllDaysYouWant.MyJoinDate,
      count( U.User_ID ) as NumberJoined
   from
      ( select
              @curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate
           from
              ( select @curDate := '2012-11-21' ) sqlvars,
              Users
           limit 18 ) AllDaysYouWant
      LEFT JOIN Users U
         on AllDaysYouWant.MyJoinDate = U.User_JoinDate
   group by
      AllDaysYouWant.MyJoinDate

Внутренний запрос, я просто присоединяюсь к таблице пользователей без ключа, поэтому он просто использовал для циклического перебора X количество записей, чтобы представить необходимый вам промежуток времени... Это может быть 30, 100, что угодно.... Столь же длинная таблица (в данном случае пользователи) имеет столько записей, сколько вы ожидаете.

Затем этот результат ничего, кроме дней, соединяется с таблицей пользователей, но на этот раз, на основе JOIN_DATE пользователя. Простой COUNT() должен предоставить вам то, что вы хотите.

"AllDaysYouWant" - это псевдоним, назначенный внутреннему запросу первой части

  ( select
          @curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate
       from
          ( select @curDate := '2012-11-21' ) sqlvars,
          Users
       limit 18 ) AllDaysYouWant

В основном это состояние... Из таблицы пользователей (но может быть любой), дайте мне 18 строк данных (через лимит, но может быть почти любое количество записей, но вам нужно только с 22 ноября по 6 декабря, который составляет всего 14 дней, но я сделал это 18, потому что для него это может быть почти что угодно. Над таблицей "Пользователи" (select @curDate: = '2012-11-21) sqlvars. Любой оператор select в запросе, который завернут в в скобках в качестве источника таблицы должен быть указан псевдоним, и поскольку это просто переменная, которую я буду использовать, мне все равно, как ее зовут. Таким образом, этот запрос запускает переменную в 21 ноября, а Select @curDate: = Date_Add... blah blah заявляет, что принимает текущее значение @curDate, добавляет 1 день к нему (теперь становится 22 ноября) и сохраняет его в возвращенной строке "MyJoinDate". Итак, теперь этот внутренний запрос создает вашу таблицу только даты, идущую с 22 ноября на 18 дней стоит данных и имеет псевдоним "AllDaysYouWant" для остальной части запроса для ссылки.

Я скорректировал запрос, который, вероятно, вы столкнулись, в alias.field все для уточнения...

Ответ 2

Что вам нужно сделать 1. Создать диапазон дат.
2. Затем выберите ту дату, которая не существует в результате запроса выше. 3. И сделайте союз с вашим запросом выше.

Ответ 3

Показывает только 66 записей, только я прошел 120 в пределе

SELECT AllDaysYouWant.MyJoinDate, count( U.id ) AS NumberJoined FROM (SELECT @curDate := Date_Add( @curDate , INTERVAL 1 DAY ) AS MyJoinDate FROM (SELECT @curDate := '2013-08-03')sqlvars, ipro_user LIMIT 150)AllDaysYouWant LEFT JOIN ipro_user U ON AllDaysYouWant.MyJoinDate = date_format( `date` , '%Y-%m-%d' ) AND U.active=1 GROUP BY AllDaysYouWant.MyJoinDate

Запрос не имеет ошибки, работает нормально