Mysql
 sql >> Base de données >  >> RDS >> Mysql

Afficher toutes les dates entre, même si aucun résultat

Vous pouvez créer un ensemble de résultats automatisé à l'aide de variables MySQL pour toutes les dates souhaitées.

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 requête interne, je me joins simplement à la table des utilisateurs sans clé, donc elle est juste utilisée pour parcourir X nombre d'enregistrements pour représenter la durée de la journée que vous voulez... Cela pourrait être 30, 100, peu importe... Juste tant que la table (dans ce cas, les utilisateurs) contient autant d'enregistrements que prévu.

ALORS, ce résultat de rien d'autre que des jours est joint à la table des utilisateurs, mais cette fois, en fonction du JOIN_DATE de l'utilisateur. Le simple COUNT() devrait vous donner ce que vous voulez.

Le "AllDaysYouWant" est l'alias attribué à la première requête interne de

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

Cela indique essentiellement ... À partir de la table des utilisateurs (mais cela pourrait être n'importe lequel), donnez-moi 18 lignes de données (via une limite, mais cela pourrait être presque n'importe quel nombre d'enregistrements, mais vous n'avez besoin que du 22 novembre au 6 décembre, ce qui n'est que 14 jours, mais j'en ai fait 18 juste pour le principe, cela pourrait être presque n'importe quoi. Au-dessus de la table Users se trouve (select @curDate :='2012-11-21' ) sqlvars. Toute instruction select dans une requête qui est entourée de parenthèses comme un La source de la table doit recevoir un alias et comme il ne s'agit que d'une variable que j'utiliserai, peu importe son nom. Ainsi, cette requête démarre la variable le 21 novembre et le Select @curDate :=Date_Add... blah blah indique de prendre la valeur actuelle de @curDate, d'y ajouter 1 jour (devient maintenant le 22 novembre) et de la stocker dans la ligne renvoyée "MyJoinDate". Alors maintenant, cette requête interne crée votre table de dates uniquement à partir du 22 novembre transmet 18 jours de données et possède l'alias "AllDaysYouWant" pour le reste de la requête à référencer.

J'ai ajusté la requête qui était probablement ce que vous avez rencontré, à alias.field tout pour plus de clarté...