sql >> データベース >  >> RDS >> Mysql

結果がない場合でも、その間のすべての日付を表示する

    必要なすべての日付のMySQL変数を使用して自動化された結果セットを構築できます。

    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
    

    内部クエリ、私はキーなしでusersテーブルに参加しているので、必要な日数を表すためにX個のレコードを循環するために使用されます...これは30、100などです。テーブル(この場合はユーザー)が、期待する数のレコードを持っている限り。

    次に、日数だけの結果がusersテーブルに結合されますが、今回はユーザーのJOIN_DATEに基づきます。単純なCOUNT()で、必要なものを取得できます。

    「AllDaysYouWant」は、

    の内部の最初の部分のクエリに割り当てられたエイリアスです。
      ( select
              @curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate
           from
              ( select @curDate := '2012-11-21' ) sqlvars,
              Users
           limit 18 ) AllDaysYouWant
    

    これは基本的に次のように述べています...usersテーブルから(ただし、任意の場合があります)、18行のデータを取得します(制限を介して、ただしほぼすべてのレコード数になる可能性がありますが、必要なのは11月22日から12月6日までです。 14日ですが、原則として18を実行しましたが、ほとんど何でもかまいません。Usersテーブルの上には(select @curDate:='2012-11-21')sqlvarsがあります。テーブルソースにはエイリアスを指定する必要があります。これは使用する変数であるため、名前は関係ありません。したがって、このクエリは11月21日に変数を開始し、Select @curDate:=Date_Add .. .. blah blahは、@ curDateの現在の値を取得し、それに1日を追加して(現在は11月22日)、返された行「MyJoinDate」に格納すると述べています。したがって、この内部クエリは、11月22日からの日付だけのテーブルを作成します。 18日分のデータを転送し、残りのクエリを参照するためのエイリアス「AllDaysYouWant」を使用します。

    おそらくあなたが遭遇したものであるクエリを、明確にするためにすべてをalias.fieldに調整しました...



    1. &のような特殊文字をOracleデータベースに入力する方法は?

    2. MySQLでUNIONを使用する場合の「エラー1250(42000):SELECTの1つからのテーブル「…」をグローバルORDER句で使用できない」を修正

    3. SQLクエリを使用する関数には、結果データの宛先がありません

    4. PostgreSQLを使用する1つのエンティティ用の複数のHibernateシーケンスジェネレータ