2012-02-14 24 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,其他人是網絡用戶。

對不起我的英文不好。

+0

這基本上是一個交叉表,並且不容易處理基本的sql。除非您需要在原始查詢結果中看到這種輸出,否則最好是通過查詢進行規則的普通「分組」,然後在客戶端進行轉換。 – 2012-02-14 19:57:34

+0

你的桌子對我來說沒有意義。請解釋欄目。 id,date_id和ip似乎很明顯,但其他3需要一些解釋。 – DwB 2012-02-14 19:59:26

+0

您的輸出顯示的是什麼,每日web用戶數量和iphone用戶數量。或者它應該是'Date,Video_id,web_viewers,IPhone_Viewers' – 2012-02-15 07:50:11

回答

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

我在想你可能需要'SUM'而不是'COUNT'。另外,我想你會想將時間戳轉換爲日期。 – 2012-02-14 20:07:08

+0

你是國王!非常感謝@Bassam謝謝別人我的問題解決了! – alioygur 2012-02-14 20:12:21

+1

@MarcusAdams感謝您的建議,你是對的! – 2012-02-14 20:12:46

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

順便說一句,如果你要算「唯一訪問者」,你可以用一個子查詢做到這一點(通過匹配用戶ID,用戶代理字符串和IP地址標識):

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 

(如果你不需要分割iPhone和非iPhone用戶之間的計數,你可以只使用COUNT(DISTINCT user_id, ip, user_agent)而不是子查詢。)

+0

不,它不會工作。因爲這個總和user_id我想要總和行。 – alioygur 2012-02-14 20:22:53

+0

在MySQL中,像'user_id = 2422'這樣的布爾表達式的值在條件爲真時爲1,如果爲假則爲0。所以'SUM(user_id = 2422)'確實計算了'user_id'等於'2422'的行數。 – 2012-02-14 20:27:55