MySQL日期/作者比较

时间:2011-10-27 15:37:54

标签: mysql wordpress

StackOverflow上有一个关于这个主题的先前问题(可以插入链接,我暂时没有权限),标题为“MySQL日期比较过滤器”,这是该主题的扩展。

我的WordPress博客上有一些作者,我希望通过MySQL获得他们的工作效率。下一个查询在MySQL下可以很好地在一天的某个时间范围内获得作者的帖子:

SELECT      SQL_CALC_FOUND_ROWS wp_posts.* 
FROM        wp_posts 
  JOIN      wp_postmeta 
  ON        (wp_posts.ID = wp_postmeta.post_id) 
WHERE       wp_posts.post_type = 'post' 
  AND       post_author = '50'
  AND       post_date
    BETWEEN STR_TO_DATE('2011-10-27 14:19:17','%Y-%m-%d %H:%i:%s')
      AND   STR_TO_DATE('2011-10-27 14:51:17','%Y-%m-%d %H:%i:%s')
GROUP BY    wp_posts.ID 
ORDER BY    wp_posts.post_date DESC 
LIMIT       0, 100

但它只给我那个小时范围内当天的帖子。我想得到一张桌子,每天和每位作者填写日常数据。在每一天和每位作者,应该有该作者当天和该小时范围内发布的帖子数量。

输出应该是这样的:

October Auth1 Auth2  Auth3
1   0   0   0
2   0   0   0
3   0   1   0
4   0   2   0
5   1   0   0
6   0   2   0
7   0   0   0
8   3   0   0
9   0   0   0
10  5   1   0
11  1   0   0
...
31  2   1   1

所以日期应该是变量,但我想包括所有作者,所以我要删除post_author AND行。

我不是MySQL的专家,但我想知道这是否可以或多或少地完成,并将查询结果(或者更确切地说,查询结果的某些字段)导出为表格,如图所示。

3 个答案:

答案 0 :(得分:1)

我不会重写您的整个查询,但这是您进行数据分组的方式:

SELECT ...
FROM ...
WHERE YEAR(post_date) = 2011 AND MONTH(post_date) = 10
GROUP BY DAY(post_date), HOUR(post_date)

为每个作者创建多个列并不能很好地利用查询。这种转换最好在你的wordpress代码中完成。

请注意,此查询将适用于确切的时钟周期,凌晨1点,凌晨2点,凌晨3点等...如果您需要任意时间(凌晨1点05分,凌晨2点05分,凌晨3点05分等等),工作,你需要一个更复杂的分组。

答案 1 :(得分:1)

我估计你应该创建一个日期引用表,填充该表,然后在查询中填充该表中的LEFT OUTER JOIN。 “如何显示缺失日期?”的问题非常common SO question,但无论如何我都会去。

预备步骤

在mysql提示符下运行:

use WordPress;

第1步 - 创建日期参考表

create table all_date 
(id int unsigned not null primary key auto_increment, 
a_date date not null,
last_modified timestamp not null default current_timestamp on update current_timestamp,
unique key `all_date_uidx1` (a_date));

第2步 - 填充日期参考表

这个表的想法是每个日期都有一行。现在你可以通过运行插入语句来实现这个目的,但为什么不编写一个例程来为你填充它(你可以创建一个MySQL scheduled event来确保你总是在表中有一套完整的日期。这是一个该例程的建议:

DELIMITER //


CREATE PROCEDURE populate_all_dates(IN from_date DATE, IN days_into_future INT)

BEGIN

 DECLARE v_date DATE;
 DECLARE ix int;


 SET ix := 0;
 SET v_date := from_date;


 WHILE v_date <= (from_date + interval days_into_future day) DO

  insert into all_date (a_date) values (v_date) 
  on duplicate key update last_modified = now();

  set ix := ix +1;

  set v_date := from_date + interval ix day;

 END WHILE;

END//

DELIMITER ;

您现在可以运行:

call populate_all_dates('2011-10-01',30);

填充十月的所有日期(或者只是将days_into_the_future参数调到你想要的任何日期。)

既然您有一个日期参考表,其中包含您感兴趣的所有日期,您可以继续执行10月份的查询:

select day(a.a_date) as 'October',
IFNULL(t.a1,0) as 'Auth1',
IFNULL(t.a2,0) as 'Auth2',
IFNULL(t.a50,0) as 'Auth50'
from all_date a
LEFT OUTER JOIN
(
SELECT date(wp.post_date) as post_date,
sum(case when wp.post_author = '1' then 1 else 0 end) as a1,
sum(case when wp.post_author = '2' then 1 else 0 end) as a2,
sum(case when wp.post_author = '50' then 1 else 0 end) as a50,
count(*) as 'All Auths'
FROM wp_posts wp
WHERE  wp.post_type = 'post'
AND wp.post_date  between '2011-10-01' and '2011-10-31 23:59:59'
GROUP BY date(wp.post_date)
) t
ON a.a_date = t.post_date
where a.a_date between '2011-10-01' and '2011-10-31'
group by day(a.a_date);

答案 2 :(得分:0)

以下查询将按作者分组帖子数。

SELECT      DAY(post_date) as d, MONTH(post_date) as m, YEAR(post_date) as y, post_author, COUNT(id) as c
FROM        wp_posts 
  JOIN      wp_postmeta 
  ON        (wp_posts.ID = wp_postmeta.post_id) 
 WHERE       wp_posts.post_type = 'post' 
  AND       post_date
    BETWEEN STR_TO_DATE('2011-10-27 14:19:17','%Y-%m-%d %H:%i:%s')
      AND   STR_TO_DATE('2011-10-27 14:51:17','%Y-%m-%d %H:%i:%s')
GROUP BY    d, m, y, post_author
ORDER BY    y, m, d, post_author 
LIMIT       0, 100

这将输出如下表格:

d   m   y    post_author    c
------------------------------------
2   10  2011  50    23
2   10  2011  51    12
2   10  2011  52    6

意思是第1行例如:2011年10月2日,身份为50的作者有23个帖子。您将首先获取数组中的作者以形成表的标题。然后用PHP迭代这个结果你可以生成一个表,就像你想要它相应地放置's和's。