sql >> Database teknologi >  >> RDS >> Mysql

Vis alle datoer mellem, selvom der ikke er noget resultat

Du kan bygge et automatiseret resultatsæt ved hjælp af MySQL-variabler til alle de datoer, du ønsker.

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

Den indre forespørgsel, jeg slutter mig lige til brugertabellen uden nøgle, så den bruges bare til at cykle gennem X antal poster for at repræsentere det dagspænd, du ønsker... Dette kunne være 30, 100, hvad som helst... Bare så længe tabellen (i dette tilfælde brugere), har så mange poster, som du forventer.

SÅ føjes resultatet af kun dage til brugertabellen, men denne gang baseret på JOIN_DATE for brugeren. Den simple COUNT() skulle give dig, hvad du ønsker.

"AllDaysYouWant" er det alias, der er tildelt den interne første del-forespørgsel i

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

Dette siger dybest set... Fra brugertabellen (men kan være hvilken som helst), giv mig 18 rækker data (via grænse, men kan være næsten et hvilket som helst antal poster, men du behøver kun fra 22. november til 6. december, hvilket kun er 14 dage, men jeg gjorde 18 bare for princippet, at det kunne være næsten hvad som helst. Over brugertabellen er (vælg @curDate :='2012-11-21' ) sqlvars. Enhver select-sætning i en forespørgsel, der er pakket ind i parentes som en tabelkilden skal have et alias, og da det kun er en variabel, jeg skal bruge, er du ligeglad med, hvad dens navn er. Så denne forespørgsel starter variablen den 21. november og vælg @curDate :=Date_Add... bla bla angiver at tage den aktuelle værdi af @curDate, tilføje 1 dag til den (bliver nu 22. nov) og gemme den i den returnerede række "MyJoinDate". Så nu opretter denne indre forespørgsel din tabel med kun datoer, der går fra 22. nov. videresend 18 dages data og har aliaset "AllDaysYouWant" for resten af ​​forespørgslen til reference.

Jeg har justeret forespørgslen, som sandsynligvis var det, du stødte på, til alias.field alt for afklaring...



  1. Sådan beskytter du filer mod uautoriserede downloads

  2. @@IDENTITY, SCOPE_IDENTITY(), OUTPUT og andre metoder til at hente sidste identitet

  3. Tidsmæssigt databasedesign med et twist (live vs kladderækker)

  4. Sådan opretter du en udvidelse til SSMS 2019 (v18)