计算按天创建的内容项

Posted

技术标签:

【中文标题】计算按天创建的内容项【英文标题】:Count content items created by day 【发布时间】:2014-02-07 05:14:53 【问题描述】:

我需要创建一个视图,该视图将显示一个表格,该表格将显示在特定日期创建的内容项的计数,如下所示:

Date       Items
2014-2-1   2
2014-2-2   3
2014-2-3   7

我创建了一个聚合视图,添加了以下字段:

“发布日期”具有自定义格式 Y-m-d 和“去除 html 标记”以及“重写结果”部分中启用的“删除空格”。 “nid”,聚合类型 = Count

然后我添加了一个关于发布日期的排序标准,粒度设置为“天”,聚合类型设置为“将结果组合在一起”。不幸的是,我得到的结果是:

Date      Items
2014-2-1  1
2014-2-1  1
2014-2-2  1
2014-2-2  1
2014-2-2  1

我错过了什么?

【问题讨论】:

按日期分组输出可能吗?聚合只是聚合,不添加输出分组。 【参考方案1】:

问题是您的视图正在运行的查询实际上如下所示:

SELECT node.created AS node_created, COUNT(node.nid) AS nid, DATE_FORMAT((DATE_ADD('19700101', INTERVAL node.created SECOND) + INTERVAL 0 SECOND), '%Y%m%d') AS node_created_day
FROM 
node node
WHERE (( (node.status = '1') AND (node.type IN  ('page')) ))
GROUP BY node_created, node_created_day
ORDER BY node_created_day DESC
LIMIT 10 OFFSET 0

它是按node_created字段分组的,它是一个时间戳

你有两个选择:

1) 安装Views Date Format SQL 模块

2) 申请this patch

这两种方法都改变了查询,所以日期实际上是用 mysql 格式化的,然后这个值用于分组。

Views Date Format SQL 模块会将查询更改为如下所示:

SELECT COUNT(node.nid) AS nid, DATE_FORMAT((DATE_ADD('19700101', INTERVAL node.created SECOND) + INTERVAL 0 SECOND), '%Y-%m-%d') AS node_created, DATE_FORMAT((DATE_ADD('19700101', INTERVAL node.created SECOND) + INTERVAL 0 SECOND), '%Y%m%d') AS node_created_day
FROM 
node node
WHERE (( (node.status = '1') AND (node.type IN  ('page')) ))
GROUP BY node_created, node_created_day
ORDER BY node_created_day DESC
LIMIT 10 OFFSET 0

这与 Mike 的解决方案具有相同的效果 - 需要另一个模块,所以我会选择 Mikes 对此的回答...

【讨论】:

你说得对,我复制了错误的查询(现已更新)。我也不知道你的方法。我认为这听起来像是最好的方法,因为不需要单独的模块或补丁。 (但如果你不知道,你永远猜不到!) 当我看到你更新了你的答案时,我删除了我的评论。我不能 100% 确定 Views 模块为我的修复工作做了什么,所以也许这是目前最好的,但如果未来对 Views 模块的更新发生变化,请注意。 @MikeBroughton 在 2 个答案中,如果视图(实体类型用户)需要显示总注册数据与总登录数据,哪个版本可以工作。例如:期间 - tot 注册 - tot 登录 jan-2017 - 17 - 12 feb-2017 - 10 - 18 @kiranking 恐怕我帮不上忙。我已经有几年没有使用 Drupal 了。当时,我启用了 MySQL 查询日志记录,并在 View 选项上使用了反复试验来获得我想要的结果。抱歉,我无法提供更有用的信息。【参考方案2】:

更新:这曾经适用于我拥有的版本。但是,对于某些人来说,情况似乎并非如此,所以我会留下它以防它对某人有帮助,但其他答案可能会更好。

如果您将“最小”聚合函数添加到“发布日期”中,以确保保持排序标准的粒度设置,您将获得所需的结果。

添加“最小”聚合函数会改变生成的 SQL 查询对结果进行分组的方式。这是之前和之后:

SELECT node.created AS node_created, COUNT(node.nid) AS nid, DATE_FORMAT((DATE_ADD('19700101', INTERVAL node.created SECOND) + INTERVAL 0   SECOND), '%Y%m%d') AS node_created_day
FROM 
node node
WHERE (( (node.status = '1') AND (node.type IN  ('dummyNode')) ))
GROUP BY node_created, node_created_day
ORDER BY node_created_day DESC
LIMIT 10 OFFSET 0

vs

SELECT COUNT(node.nid) AS nid, MIN(node.created) AS node_created, DATE_FORMAT((DATE_ADD('19700101', INTERVAL node.created SECOND) + INTERVAL 0  SECOND), '%Y%m%d') AS node_created_day
FROM 
node node
WHERE (( (node.status = '1') AND (node.type IN  ('dummyNode')) ))
GROUP BY node_created_day
ORDER BY node_created_day DESC
LIMIT 10 OFFSET 0

您可以看到“GROUP BY node_created”已被删除。

【讨论】:

以上是关于计算按天创建的内容项的主要内容,如果未能解决你的问题,请参考以下文章

nginx按天切割日志

vSphere 6.5之创建内容库和虚拟机

如何在bigquery中按天计算(非)连续记录?

2021亚太内容分发大会 阿里云荣获三项大奖

Laravel 查询生成器按天计算行数 SQL db::raw

Python - 按天算年龄