创建报告,显示开始日期和结束日期之间每天的特定统计信息

时间:2011-07-25 21:30:09

标签: php mysql

我有一张表格,其中包含我希望在特定日期范围内显示每天统计数据的信息。该表包含以下内容:

CREATE TABLE IF NOT EXISTS `questions` (
  `qid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `question_created_date` datetime NOT NULL,
  `question_response_date` datetime NOT NULL,
)

我能够使用以下查询显示$ start_date和$ end_date之间每天创建的问题数量。

SELECT COUNT(*) as q_count, DATE(question_created_date) as date FROM questions where question_created_date between "$start_date" and "$end_date" GROUP BY date ORDER BY date asc

我还想列出在同一天回复的主题数量。例如,如果在2011年7月5日有10个新问题和5个问题得到回应,并且在7/6/11有5个新问题和11个问题回复,我希望能够显示:

Date|New|Responded

7/5/11 10 05
7/6/11 05 11

可以通过mysql完成吗?

我知道我可以执行上面列出的查询,然后每天执行另一个查询以获取当天响应的问题数量,但我想知道是否有更简单,更有效的方法在一个查询。

提前致谢。

2 个答案:

答案 0 :(得分:1)

这两个日期彼此无关,但从逻辑上讲,响应日期只能大于创建日期。在一个日期进行分组会破坏您可以从另一个日期提取的任何信息,换句话说 - 您将需要两个查询。

返回的字段是相同的 - 计数和日期字段,因此您可以将其作为单个查询调用发出,但它必须作为联合查询完成:

SELECT 'created' as src, count(*) as cnt, DATE(question_created_date) as created ...

UNION

SELECT 'answered' as src, count(*) as cnt, etc...

虚拟'src'列将告诉您哪个内部查询产生了结果,并且union语法允许您将所有内容作为单个查询发出。但是在MySQL中,它仍然被视为两个完全独立的查询,其结果恰好一次性返回。

答案 1 :(得分:0)

你可以使用UNION做这样的事情。 MySQL可能有一个更高效的内置运算符,但这也可以工作:

select main.date, max(qcd), max(qrd) from 
(SELECT DATE(question_created_date) as date, count(*) as qcd, 0 as qrd FROM questions  
    where question_created_date between "$startdate" and "$enddate" GROUP BY date
union
SELECT DATE(question_response_date) as date, 0, count(*) as qrd FROM questions 
    where question_response_date between "$startdate" and "$enddate" GROUP BY date) 
main group by main.date order by main.date asc;