我希望能够unnest()
在具有许多JOIN
s的复杂SQL查询中使用PostgreSQL中的函数。这是查询示例:
SELECT 9 as keyword_id, COUNT(DISTINCT mentions.id) as total, tags.parent_id as tag_id
FROM mentions
INNER JOIN taggings ON taggings.mention_id = mentions.id
INNER JOIN tags ON tags.id = taggings.tag_id
WHERE mentions.taglist && ARRAY[9] AND mentions.search_id = 3
GROUP BY tags.parent_id
我想在taggings
这里删除该表,因为我的mentions
表具有一个名为 taglist* 的 整数数组
字段,该字段由所有链接的tag id组成。
*mentions
我尝试了以下操作:
SELECT 9 as keyword_id, COUNT(DISTINCT mentions.id) as total, tags.parent_id as tag_id
FROM mentions
INNER JOIN tags ON tags.id IN (SELECT unnest(taglist))
WHERE mentions.taglist && ARRAY[9] AND mentions.search_id = 3
GROUP BY tags.parent_id
此方法有效,但带来的结果与第一个查询不同。
所以我要做的是SELECT unnest(taglist)
在JOIN
查询中使用的结果来补偿taggings
表。
我怎样才能做到这一点?
UPDATE: taglist
与提及的标记ID的列表相同。
从技术上讲,您的查询可能会这样工作(不能完全确定此查询的目标):
SELECT 9 AS keyword_id, count(DISTINCT m.id) AS total, t.parent_id AS tag_id
FROM (
SELECT unnest(m.taglist) AS tag_id
FROM mentions m
WHERE m.search_id = 3
AND 9 = ANY (m.taglist)
) m
JOIN tags t USING (tag_id) -- assumes tag.tag_id!
GROUP BY t.parent_id;
但是,在我看来,您在这里走错了方向。通常,将删除冗余阵列taglist
并保留规范化的数据库架构。然后,您的原始查询应该可以很好地服务,仅使用别名缩短语法:
SELECT 9 AS keyword_id, count(DISTINCT m.id) AS total, t.parent_id AS tag_id
FROM mentions m
JOIN taggings mt ON mt.mention_id = m.id
JOIN tags t ON t.id = mt.tag_id
WHERE 9 = ANY (m.taglist)
AND m.search_id = 3
GROUP BY t.parent_id;
<rant>
您“不同结果”的根本原因是不幸的命名约定,这是一些 知识上有挑战性的ORM 强加给人的。
我说的** ~~id~~**
是列名。切勿在具有多个表的数据库中使用此反模式。是的,这基本上意味着 任何
数据库。一旦加入一堆表(这就是您在数据库中 所做 的),您最终会得到一堆名为的列id
。毫无意义。
名为表的ID列tag
应为 tag_id
(除非有另一个描述性名称)。永远不要id
。 </rant>
您的查询无意中计数,tags
而不是mentions
:
SELECT 25 AS keyword_id, count(m.id) AS total, t.parent_id AS tag_id
FROM (
SELECT unnest(m.taglist) AS id
FROM mentions m
WHERE m.search_id = 4
AND 25 = ANY (m.taglist)
) m
JOIN tags t USING (id)
GROUP BY t.parent_id;
它应该这样工作:
SELECT 25 AS keyword_id, count( **DISTINCT** m.id) AS total, t.parent_id
FROM (
SELECT **m.id** , unnest(m.taglist) **AS tag_id**
FROM mentions m
WHERE m.search_id = 4
AND 25 = ANY (m.taglist)
) m
JOIN tags t **ON t.id = m.tag_id**
GROUP BY t.parent_id;
我还DISTINCT
向您添加count()
了在查询过程中迷路的。
问题内容: 大约几个小时前,我在Stack Overflow上询问了有关如何将char []转换为MD5哈希的方法。 Neil Smithline建议我使用BCrypt,但不能将其与char []一起使用。 我使用char []来存储从登录表单中检索到的密码的原因是因为仅支持char []。 当前,我正在尝试使用上面的代码生成哈希,但是由于变量passwordCars的类型为char [],因此不
问题内容: Node.js非常适合我们的Web项目,但是很少有需要Python的计算任务。我们已经为他们准备了Python代码。我们非常关心速度,如何以异步非阻塞方式从node.js调用Python“工人”的最优雅方法是什么? 问题答案: 对于node.js和Python服务器之间的通信,如果两个进程都在同一服务器上运行,则我将使用Unix套接字,否则将使用TCP / IP套接字。对于封送处理协议
问题内容: 我正在尝试在我的应用程序中通过turbolinks使用Angularjs框架。页面更改后,请勿初始化新的事件监听器。有什么办法可以使其工作吗?提前致谢! 问题答案: AngularJS与Turbolinks Turbolink 和 AnguluarJS 都可以用来使Web应用程序更快地响应,在某种意义上,响应用户交互,网页上发生了某些事情,而无需重新加载和重新呈现整个页面。 它们在以下
问题内容: 我正在尝试遵循Elasticsearch 5官方文档来设置传输客户端: https://www.elastic.co/guide/zh-CN/elasticsearch/client/java- api/5.0/transport- client.html 但是,使用包org.elasticsearch:elasticsearch:5.0.0-rc1时,类PreBuiltTranspo
问题内容: 选择下拉列表选项时,有什么方法可以刷新页面的某些部分(例如div / span)?请注意,我使用的是razor语法。 如果是,那么请提供一些示例代码。 问题答案: 是的,您可以订阅活动。 可能是这样(真实示例): 然后具有此javascript函数(或类似功能) 编辑:此示例假设您使用的是非侵入式验证(因此使用jQuery),并且想要提交表单,但是显然您可以为onchange事件调用任
问题内容: 我在这里尝试遵循John Papa的angularJS样式指南,并已开始将我的指令切换为使用controllerAs。但是,这不起作用。我的模板似乎无法访问分配给vm的任何内容。请参见这个非常简单的plnkr示例,该示例展示了该行为。 http://plnkr.co/edit/bVl1TcxlZLZ7oPCbk8sk?p=preview 问题答案: 当使用controllerAs语法时