sql >> Databasteknik >  >> RDS >> Mysql

Visa alla datum mellan, även om inget resultat

Du kan bygga ut en automatisk resultatuppsättning med MySQL-variabler för alla datum du vill.

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 inre frågan, jag ansluter mig bara till användartabellen utan nyckel, så den används bara för att bläddra igenom X antal poster för att representera dagsintervallet du vill ha... Det här kan vara 30, 100, vad som helst... Bara så länge tabellen (i detta fall användare), har så många poster som du förväntar dig.

DÅ läggs resultatet av bara dagar till användartabellen, men den här gången baserat på JOIN_DATE för användaren. Den enkla COUNT() bör ge dig vad du vill ha.

"AllDaysYouWant" är aliaset som tilldelats den interna första delen av

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

Detta säger i princip... Från användartabellen (men kan vara vilken som helst), ge mig 18 rader med data (via limit, men kan vara nästan vilket antal poster som helst, men du behöver bara från 22 november till 6 december, vilket är bara 14 dagar, men jag gjorde 18 bara för principen att det kunde vara nästan vad som helst. Ovanför tabellen Användare finns (välj @curDate :='2012-11-21' ) sqlvars. Vilken select-sats som helst inom en fråga som är inslagen inom parentes som en tabellkällan måste ges ett alias och eftersom det bara är en variabel jag kommer att använda, bryr sig inte vad den heter. Så, den här frågan startar variabeln den 21 november och Välj @curDate :=Date_Add... blah blah anger att ta det aktuella värdet av @curDate, lägga till 1 dag till det (blir nu 22 nov) och lagra det i den returnerade raden "MyJoinDate". Så nu skapar den här inre frågan din tabell med bara datum som går från 22 nov. vidarebefordra 18 dagars data och har aliaset "AllDaysYouWant" för resten av frågan att referera till.

Jag har justerat frågan som förmodligen var vad du stötte på, till alias.field allt för förtydligande...



  1. Inner Join laravel 5.2

  2. Introduktion av vanliga tabelluttryck i SQL Server

  3. Vad är skillnaden mellan VARCHAR och CHAR?

  4. MySQL Fulltext Stopwords motivering