我有一个查询3个表:用户的mysql统计数据 - 如何获取每个日期范围的列?
apiusers,用户
- 这些包含用户ID和名称。
download_stats:
此包含的用户类型(1 =用户,2 = apiusers),日期,文件downloaded_id。
我想要做的是得到一个布局:
|用户ID |名称|下载1月的统计信息|下载统计二月
等
我目前正在此查询,这需要永远尝试:
SELECT name,queryuserid,count(ROWA.id) ,count(ROWB.id)
FROM (SELECT IFNULL(u.name, au.companyname) AS name,IFNULL(u.id, au.id) AS queryuserid
FROM apiusers as au, users as u
GROUP BY 2) AS users
LEFT JOIN stats_download as ROWA ON ROWA.userid=queryuserid AND ROWA.date > date('2011-01-01') AND ROWA.date < date('2011-02-01')
LEFT JOIN stats_download as ROWB ON ROWB.userid=queryuserid AND ROWB.date > date('2011-01-01') AND ROWB.date < date('2011-02-01')
GROUP BY 2;
有没有要去这个更好的办法?客户希望支持按年,月和日“分组”输出统计数据。所以那里可能有30+的LEFT JOIN。
我认为,要获得这种信息'行明智',你需要做大连接。您可以使用MONTH(ROWn.date)=来优化日期选择,而不是使用日期范围。 –
ethrbunny
我也想知道是否有一种方法可以使用存储过程在临时表中累积这些信息,然后以这种逐行方式输出它。否则,如果您想使查询更简单,您需要使用某种后置处理器(Perl或PHP等)来获得此显示。 – ethrbunny
问题的第一个问题是,将APIUsers连接到用户的内部查询没有JOIN条件,因此您得到一个笛卡尔产品......它们之间有什么关系。此外,你的RowA和RowB是相同的......你是否打算实际上滚动日期来模拟每个月的下载统计数据(例如)? – DRapp