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的专家,但我想知道这是否可以或多或少地完成,并将查询结果(或者更确切地说,查询结果的某些字段)导出为表格,如图所示。
答案 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。