2012-02-14 29 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