14
SELECT User_JoinDate, 
COUNT(User_ID) 
FROM Users WHERE `User_JoinDate` 
BETWEEN '2012-11-22' AND '2012-12-06' 
GROUP BY User_JoinDate 
ORDER BY User_JoinDate ASC"

折れ線グラフで表示するデータを生成しています。残念ながら、ユーザーが登録していない可能性のある日付に対して上記のクエリで0を表示する方法がわかりません。したがって、現在、私の出力は次のようになります。

2012-11-22-2
2012-11-25-4

しかし、私が欲しいのは

2012-11-22-2
2012-11-23-0
2012-11-24-0
2012-11-25-4

私は現在、MySQLの結果を配列に格納し、PHPがループして空白を埋める作業バージョンを持っています。これは非常に厄介なようで、MySQLによる解決策があることを期待していました。私はサイトをよく検索しましたが、いくつかの実装を理解するのに苦労しました。助言がありますか?

4

3 に答える 3

11

必要なすべての日付の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)が、期待する数のレコードを持っている限り。

次に、日数だけの結果が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 .. ..何とか何とかは、@ curDateの現在の値を取得し、それに1日を追加して(現在は11月22日)、返された行「MyJoinDate」に格納すると述べています。この内部クエリは、11月22日から18日分のデータに相当する日付のテーブルを作成し、残りのクエリが参照するためのエイリアス「AllDaysYouWant」を持ちます。

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

于 2012-12-06T23:48:32.370 に答える
1

あなたがする必要があること
1.日付範囲を生成します。
2.次に、上記の結果のクエリに存在しない日付を選択
します。3.上記のクエリと結合します。

于 2012-12-06T23:50:25.237 に答える
1

それは私が制限で120を通過しただけで66のレコードを示しています

SELECT AllDaysYouWant.MyJoinDate, count( U.id ) AS NumberJoined FROM (SELECT @curDate := Date_Add( @curDate , INTERVAL 1 DAY ) AS MyJoinDate FROM (SELECT @curDate := '2013-08-03')sqlvars, ipro_user LIMIT 150)AllDaysYouWant LEFT JOIN ipro_user U ON AllDaysYouWant.MyJoinDate = date_format( `date` , '%Y-%m-%d' ) AND U.active=1 GROUP BY AllDaysYouWant.MyJoinDate

クエリにエラーはなく、正常に機能しています

于 2013-09-26T12:53:05.123 に答える