PostgreSQL:使用 ONLY_FULL_GROUP_BY 事件的 2 级连接的 COUNT() 行

标签 postgresql drupal group-by count drupal-8

问题

我在使用 2 级连接编写计算结果行的功能查询时遇到问题。

数据库表

我有以下(简化的)表格(正在开发的环境是 Drupal 8 btw,使用数据库服务):

nodes 表:

id - 数字 id
标题 - varchar

示例条目:

id   title
1    My first article
2    My second article
3    My third article

comments 表:

cid - 数字 id
entity_type - varchar,被注释的实体
entity_id - 数字 ID,包含引用
status - int,0 表示未发布,1 表示已发布
评论 - 文本

示例条目:

cid   entity_type   entity_id   status   comment
1     node          1           1        foo
2     node          1           1        bar
3     comment       1           1        baz
4     node          1           0        spam/foul language/whatever
5     node          2           1        yeeeha

数据结构说明

“节点”可以被评论。然后评论被存储在“评论”表中。对于每条评论,都有一个专门的行,其中包含评论的 ID、评论的实体类型(可以是“节点”和“评论”)和评论实体的 ID。评论也可以被评论——这些“回复”也存储在“评论”表中,因此这些条目包含“评论”作为 entity_id 和回复的评论的 id。

我现在想通过单个查询获得以下结果:

id    title                comments
1     My first article     3
2     My second article    1
3     My third article     0

comments 应该包含对给定节点的所有已发布评论和已发布回复的总和。因此,如果一个节点被直接评论了两次,并且这些评论之一也被评论了,则 comments 计数应该为 3。 (注:atm“回复”评论不能回复,所以这里只有3级环境(node <comment <comment)).

正在使用的数据库:

正在使用的数据库是 PostgreSQL 9.6,ONLY_FULL_GROUP_BY 处于事件状态。

我尝试了什么

我现在已经花了几个小时尝试查询数据,这些查询几乎都类似于以下内容(使用 Drupal 的数据库服务 select 接口(interface)):

SELECT n.id, n.title, COUNT(c.cid)+COUNTr.cid) AS comments
FROM nodes n
LEFT JOIN comments c
ON c.type = "node" AND n.id = c.entity_id AND c.status = 1
LEFT JOIN comments r
ON r.type = "comment" AND c.id = r.entity_id AND r.status = 1
GROUP BY n.id, n.title, c.entity_id, r.entity_id

但对于我来说,我就是想不出编写查询的正确方法。我的基本想法是选择基表节点,左加入第一阶段的评论,然后再次左加入对第一个加入的回复。但似乎我的数据库对我的查询有其他想法...... ¯\_(ツ)_/¯

我真的希望有人能让我回到正轨。任何帮助是极大的赞赏!感谢您花时间阅读所有这些内容。

最佳答案

首先,让我们了解您所写和遗漏的内容 - 在查询中,您在第一行的计数之后遗漏了一个 (。

其次,您使用额外的“r.entity_id”进行分组,这不是必需的,它会隔离结果。

三阶结果按节点id升序排列。

如果对您有帮助,请使用下面的查询并将答案标记为正确。

SELECT n.id, n.title, COUNT(c.cid)+COUNT(r.cid) AS comments
FROM nodes n
 left JOIN comments c
ON c.entity_type = 'node' AND n.id = c.entity_id AND c.status = 1
 left JOIN comments r
ON r.entity_type = 'comment' AND c.cid = r.entity_id AND r.status = 1
GROUP BY n.id, n.title, c.entity_id 
order by n.id asc

关于PostgreSQL:使用 ONLY_FULL_GROUP_BY 事件的 2 级连接的 COUNT() 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58357672/

相关文章:

sql - 两个日期之间的年差

每天的 SQL 累计总和用每个用户的新余额刷新

SQL:按顺序排序,然后为多列选择具有不同值的第一行

mysql - 如何使用 `sql/mysql` 从公共(public)列下的 `groupby` 获取嵌套数组,而不使用 foreach 来构造数据?

postgresql - 表未在指定模式中创建

postgresql - Postgres CASE 表达式 ELSE 子句即使在子句 'true' 时也会影响性能

jquery - Drupal 和 jquery

javascript - Vanilla JS 相当于 jQuery $.once()?

drupal - Drupal hook_menu实现中的可选参数

mysql - 使用分组依据和条件优化 SQL 查询