Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mostrar todas as datas entre eles, mesmo se nenhum resultado


Você pode construir um conjunto de resultados automatizado usando variáveis ​​MySQL para todas as datas que desejar.
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

A consulta interna, estou apenas juntando à tabela de usuários sem chave, então é usado apenas para percorrer X número de registros para representar o período de dias que você deseja ... Isso pode ser 30, 100, o que for .... Apenas contanto que a tabela (neste caso usuários), tenha tantos registros quantos você espera.

ENTÃO, esse resultado de nada além de dias é adicionado à tabela de usuários, mas desta vez, com base no JOIN_DATE do usuário. O simples COUNT() deve obter o que você deseja.

O "AllDaysYouWant" é o alias atribuído à consulta interna da primeira parte do
  ( select
          @curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate
       from
          ( select @curDate := '2012-11-21' ) sqlvars,
          Users
       limit 18 ) AllDaysYouWant

Isso basicamente afirma ... Da tabela de usuários (mas pode ser qualquer um), me dê 18 linhas de dados (via limite, mas pode ser quase qualquer número de registros, mas você só precisa de 22 de novembro a 6 de dezembro, que é apenas 14 dias, mas eu fiz 18 apenas por princípio, pode ser quase qualquer coisa. Acima da tabela Users está (select @curDate :='2012-11-21') sqlvars. Qualquer instrução select dentro de uma consulta que esteja entre parênteses como um table source deve receber um alias e como é apenas uma variável que estarei usando, não importa qual seja o seu nome. Portanto, esta consulta inicia a variável em 21 de novembro e o Select @curDate :=Date_Add... blá blá indica para pegar o valor atual de @curDate, adicionar 1 dia a ele (agora se torna 22 de novembro) e armazená-lo na linha retornada "MyJoinDate". Então, agora, essa consulta interna cria sua tabela apenas de datas a partir de 22 de novembro encaminhar 18 dias de dados e tem o alias "AllDaysYouWant" para o restante da consulta para referência.

Eu ajustei a consulta que provavelmente foi o que você encontrou, para alias.field tudo para esclarecimento ...