Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pokaż wszystkie daty między, nawet jeśli nie ma wyników

Możesz zbudować zautomatyzowany zestaw wyników, używając zmiennych MySQL dla wszystkich dat, które chcesz.

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

Zapytanie wewnętrzne, po prostu dołączam do tabeli użytkowników bez klucza, więc po prostu używam go do przechodzenia przez liczbę X rekordów reprezentujących żądany przedział dnia ... Może to być 30, 100, cokolwiek .... Po prostu tak długo, jak tabela (w tym przypadku użytkownicy) zawiera tyle rekordów, ile oczekujesz.

WTEDY ten wynik tylko dni jest dołączany do tabeli użytkowników, ale tym razem na podstawie JOIN_DATE użytkownika. Prosta COUNT() powinna dać ci to, czego chcesz.

„AllDaysYouWant” to alias przypisany do wewnętrznego zapytania pierwszej części

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

To zasadniczo stwierdza... Z tabeli użytkowników (ale może być dowolna), podaj mi 18 wierszy danych (przez limit, ale może to być prawie dowolna liczba rekordów, ale potrzebujesz tylko od 22 listopada do 6 grudnia, czyli tylko 14 dni, ale zrobiłem 18 tylko dla zasady, może to być prawie wszystko.Powyżej tabeli Użytkownicy znajduje się (select @curDate :='2012-11-21' ) sqlvars.Każda instrukcja select w zapytaniu, która jest opakowana w nawiasy jako źródło tabeli musi mieć alias, a ponieważ jest to tylko zmienna, której będę używał, nie obchodzi mnie, jaka jest jej nazwa.Tak więc ta kwerenda uruchamia zmienną 21 listopada, a Select @curDate :=Date_Add... blah blah oznacza, że ​​bierze bieżącą wartość @curDate, dodaje do niej 1 dzień (teraz staje się 22 listopada) i przechowuje ją w zwróconym wierszu „MyJoinDate”. Więc teraz to wewnętrzne zapytanie tworzy Twoją tabelę tylko dat, począwszy od 22 listopada do przodu 18 dni danych i ma alias „AllDaysYouWant” dla reszty zapytania do odniesienia.

Dostosowałem zapytanie, które prawdopodobnie było tym, co napotkałeś, do alias.field wszystko w celu wyjaśnienia...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django grupuj według dat i wartości SUMA

  2. Symfony2 - Doctrine2 QueryBuilder GDZIE W polu ManyToMany

  3. Pobieranie org.hibernate.exception.JDBCConnectionException:nie można wykonać zapytania nawet przez JNDI

  4. Jak wykonać zapytanie, które jest zapisane w kolumnie tabeli MySQL?

  5. Dlaczego otrzymuję błąd MySQL #1312 podczas korzystania z prostej procedury składowanej?