2012-12-06 6 views
13
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を通して解決策があることを期待していました。私はサイトをよく調べていますが、いくつかの実装を理解するのには苦労しています。助言がありますか?

+0

正常に動作し、エラーがない合格した66件のレコードを示していますどのように、私はそこにいると確信しています)、その後、そのテーブルとの結合を行います。 – ajon

答えて

11

MySQLの変数を使用して自動化された結果セットを作成することができます。そのちょうどあなたがしたい日のスパンを表現するために、レコードのX番号を循環するために使用して

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テーブルに参加しています...これは30、100である可能性があり、何でも....テーブル(この場合はユーザー)と同様に、あなたが期待しているレコードの数が多くあります。

THENの場合、結果は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 

これの内部最初の部分クエリに割り当てられた別名は基本的にはユーザーテーブルから...述べている(しかし、どんなことができる)で、私のデータの18行を与えます( 11月22日から12月6日までは14日しか必要としませんが、原理的にはほとんど何でも可能な18でした。ユーザーテーブルの上には(select @ curDate:= '2012-11-21')sqlvars。カッコ内にテーブルソースとしてラップされたクエリ内のselectステートメントには、エイリアスを指定する必要があります。これは単に使用する変数であるため、気にしないでくださいこれは11月21日に変数を開始し、Select @curDate: = Date_Add ... @curDateの現在の値を取得し、1日追加して(今は11月22日になります)、返された行「MyJoinDate」に格納されます。だから今この内側のクエリは、11月22日から18日分のデータのあなたのテーブルの日付を作成し、残りのクエリを参照するための別名 "AllDaysYouWant"を持っています。

私はあなたが
1日付範囲の生成を行うために必要なもの...

+0

お返事ありがとうございます。残念ながら、MyJoinDate FROM(SELECT @curDate:= '2'。 – user1883978

+0

@ user1883978)のように、 '1、@curDateの近くでMySQL構文エラーが発生しています... SQLサーバと日付計算のMySQL ... date_add()content – DRapp

+0

これは、このようなより複雑なクエリには、私の完全な知識が不足している可能性がありますが、うまくいきません。クエリをそのまま使用しようとすると「列」が表示されます。 – user1883978

1

を明確化のためにすべてをalias.fieldし、あなたが遭遇したものを、おそらくだったクエリを調整してきました。
2.上記のクエリ結果に存在しない日付を選択します。
3.上記のクエリを使用してユニオンを作成します。

1

それは私が(私だけが限度で120

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 

クエリは、私はあなたにすべての日付を与えるクエリを作成します始めるための場所として

関連する問題