sql >> Base de Datos >  >> RDS >> Mysql

Mostrar todas las fechas entre, incluso si no hay resultados

Puede crear un conjunto de resultados automatizado utilizando variables de MySQL para todas las fechas que desee.

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

La consulta interna, simplemente me estoy uniendo a la tabla de usuarios sin clave, por lo que solo se usa para recorrer X número de registros para representar el lapso de días que desea... Esto podría ser 30, 100, lo que sea... Simplemente siempre que la tabla (en este caso, los usuarios) tenga tantos registros como espera.

ENTONCES, ese resultado de nada más que días se une a la tabla de usuarios, pero esta vez, en función del JOIN_DATE del usuario. El simple COUNT() debería darte lo que quieres.

El "AllDaysYouWant" es el alias asignado a la consulta interna de la primera parte de

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

Esto básicamente dice... De la tabla de usuarios (pero podría ser cualquiera), deme 18 filas de datos (a través del límite, pero podría haber casi cualquier cantidad de registros, pero solo necesita del 22 de noviembre al 6 de diciembre, que es solo 14 días, pero hice 18 solo por principio, podría ser casi cualquier cosa. Encima de la tabla Usuarios está (select @curDate :='2012-11-21' ) sqlvars. Cualquier declaración de selección dentro de una consulta que está entre paréntesis como un a la fuente de la tabla se le debe dar un alias y, dado que es solo una variable que usaré, no importa cuál sea su nombre. Por lo tanto, esta consulta inicia la variable el 21 de noviembre y selecciona @curDate :=Date_Add... bla, bla, dice tomar el valor actual de @curDate, agregarle 1 día (ahora se convierte en el 22 de noviembre) y almacenarlo en la fila devuelta "MyJoinDate". Así que ahora, esta consulta interna crea su tabla de solo fechas a partir del 22 de noviembre reenvía 18 días de datos y tiene el alias "AllDaysYouWant" para hacer referencia al resto de la consulta.

Ajusté la consulta que probablemente fue lo que encontraste, a alias.field todo para aclaración...