sql >> Database >  >> RDS >> Mysql

Toon alle datums tussen, ook als er geen resultaat is

U kunt een geautomatiseerde resultatenset samenstellen met MySQL-variabelen voor alle gewenste datums.

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

De innerlijke vraag, ik voeg me gewoon toe aan de gebruikerstabel zonder sleutel, dus het wordt gewoon gebruikt om door X aantal records te bladeren om de gewenste dagspanne weer te geven ... Dit kan 30, 100 zijn, wat dan ook .... Gewoon zolang de tabel (in dit geval gebruikers), zoveel records heeft als u verwacht.

DAN wordt dat resultaat van niets anders dan dagen toegevoegd aan de gebruikerstabel, maar deze keer op basis van de JOIN_DATE van de gebruiker. De simpele COUNT() zou je moeten geven wat je wilt.

De "AllDaysYouWant" is de alias die is toegewezen aan de interne eerste deelquery van

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

Dit staat in feite... Van de gebruikerstabel (maar kan elke zijn), geef me 18 rijen met gegevens (via limiet, maar kan bijna elk aantal records zijn, maar je hebt alleen nodig van 22 november tot 6 december, wat alleen 14 dagen, maar ik deed er 18 uit principe, het kan bijna alles zijn. Boven de tabel Gebruikers staat (select @curDate :='2012-11-21' ) sqlvars. Elke select-instructie binnen een query die tussen haakjes staat als een tabelbron moet een alias krijgen en aangezien het slechts een variabele is die ik zal gebruiken, maakt het niet uit wat de naam is. Dus deze query start de variabele op 21 november en de Select @curDate :=Date_Add... blah blah staten om de huidige waarde van @curDate te nemen, er 1 dag aan toe te voegen (nu wordt het 22 november) en deze op te slaan in de geretourneerde rij "MyJoinDate". Dus nu maakt deze innerlijke query uw tabel met alleen datums vanaf 22 november 18 dagen aan gegevens doorsturen en heeft de alias "AllDaysYouWant" voor de rest van de query om naar te verwijzen.

Ik heb de vraag, die je waarschijnlijk bent tegengekomen, aangepast naar alias.field alles voor verduidelijking...



  1. Oracle Shutdown-fout ORA-01033

  2. Overzicht creëren over verschillende databases

  3. FOUT:De verbinding staat in de autoCommit-modus

  4. Wat zijn de voordelen van een datamanagementsysteem?