2012-02-14 5 views
1

私はビデオサイトを持っていると私はこのような表にヒット統計情報を格納しています:mysqlの数の多列

+------------+------------------+------+-----+-------------------+----------------+ 
| Field  | Type    | Null | Key | Default   | Extra   | 
+------------+------------------+------+-----+-------------------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL    | auto_increment | 
| user_id | int(10) unsigned | NO | MUL | NULL    |    | 
| video_id | int(10) unsigned | NO | MUL | NULL    |    | 
| user_agent | varchar(500)  | NO |  | NULL    |    | 
| ip   | varchar(255)  | NO |  | NULL    |    | 
| date_add | timestamp  | NO | MUL | CURRENT_TIMESTAMP |    | 
+------------+------------------+------+-----+-------------------+----------------+ 

私は(2012-02-14: 5000 web views, 850 iphone viewsのように)、毎日の統計を表示したい、このように:

+---------------------+---------+---------------+ 
| date    | web  | iphone  | 
+---------------------+---------+---------------+ 
| 2012-02-09   | 500 | 478   | 
| 2012-02-10   | 2377 | 204   | 
| 2012-02-12   | 247 | 21   | 
| 2012-02-13   | 4879 | 236   | 
| 2012-02-14   | 8767 | 101   | 
+---------------------+---------+---------------+ 

iPhoneユーザーIDは2422です。他のユーザーはWebユーザーです。

私の悪い英語を申し訳ありません。

私が正しくあなたの質問を理解している場合
+0

これは基本的にクロスタブで、基本SQLではやりやすいことではありません。未処理のクエリ結果でこの種の出力を確認する必要がある場合を除き、通常の「グループ化」クエリを実行してから、クライアントで変換を実行する方がよいでしょう。 –

+0

あなたのテーブルは私には意味をなさない。列を説明してください。 id、date_id、ipは明らかですが、他の3人は説明が必要です。 – DwB

+0

あなたの出力は何を表示しますか、毎日のWebユーザーとiphoneユーザーの数です。または、それは 'Date、Video_id、web_viewers、IPhone_Viewers'でなければなりません。 –

答えて

2
SELECT DATE(date_add) AS date, 
     SUM(CASE WHEN user_id = 2422 THEN 0 ELSE 1 END) AS Web, 
     SUM(CASE WHEN user_id = 2422 THEN 1 ELSE 0 END) AS iPhone 
FROM stats 
GROUP by DATE(date_add) 
+1

私はあなたが' COUNT'ではなく 'SUM'を望むと思っています。また、タイムスタンプを日付に変換したいと思うでしょう。 –

+0

あなたは王様です!非常に@バッサムに感謝他の人に感謝私の問題は解決される! – alioygur

+1

@MarcusAdams提案していただきありがとうございます、あなたは正しいです! –

0

、このクエリのような何かがそれを行う必要があります。

SELECT 
    DATE(date_add) AS date, 
    SUM(user_id != 2422) AS web, 
    SUM(user_id = 2422) AS iphone 
FROM stats 
GROUP BY date 

あなたはtry it on SQLizeをすることができます。

SELECT 
    date, 
    SUM(user_id != 2422) AS web, 
    SUM(user_id = 2422) AS iphone 
FROM 
    (SELECT DATE(date_add) AS date, user_id 
    FROM stats 
    GROUP BY date, user_id, ip, user_agent) AS foo 
GROUP BY date 

(もし:あなたは「ユニーク訪問者を」カウントしたい場合、あなたはサブクエリでそれを行うことができます(一致するユーザーID、ユーザーエージェント文字列やIPアドレスで識別)ところで

、あなたはiPhoneとiPhone以外のユーザーの間でカウントを分割する必要はありませんでしたが、サブクエリの代わりにCOUNT(DISTINCT user_id, ip, user_agent)を使用することができます)。

+0

いいえ動作しません。この合計user_idは合計行を必要とするためです。 – alioygur

+0

MySQLでは、 'user_id = 2422'のようなブール式の値は、条件が真であれば1、偽であれば0です。したがって、 'SUM(user_id = 2422)'は 'user_id'が' 2422'に等しい行の数を実際に数えます。 –