Sql 使用单个查询聚合两个不同的事件表
我有一个简单的模式,其中一个表用于Sql 使用单个查询聚合两个不同的事件表,sql,postgresql,join,Sql,Postgresql,Join,我有一个简单的模式,其中一个表用于帖子,两个表用于跟踪视图和上传投票: CREATE TABLE posts ( id integer NOT NULL PRIMARY KEY, title VARCHAR(255) NOT NULL ); CREATE TABLE views ( post_id integer, value integer ); CREATE TABLE upvotes ( post_id integer, value in
帖子
,两个表用于跟踪视图
和上传投票
:
CREATE TABLE posts (
id integer NOT NULL PRIMARY KEY,
title VARCHAR(255) NOT NULL
);
CREATE TABLE views (
post_id integer,
value integer
);
CREATE TABLE upvotes (
post_id integer,
value integer
);
请注意,views
和upvots
中的元组表示视图和upvots的一般数量。我想汇总这些帖子,显示浏览量和投票总数
我以为这很简单,但不幸的是我失败了
这是我的疑问:
SELECT posts.title,
SUM(views.value) AS views,
SUM(upvotes.value) AS upvotes
FROM posts
LEFT OUTER JOIN views ON (posts.id = views.post_id)
LEFT OUTER JOIN upvotes ON (posts.id = upvotes.post_id)
GROUP BY posts.id;
我知道为什么失败,但我真的不知道怎么做。如果我需要运行两个不同的查询,并在应用程序级别聚合结果,我可以这样做。我只是想知道,一个查询是否可行
我创建了一个。
PS:我只使用一个通用表来跟踪事件,但我希望将表分开 您可以安全地计算子查询中的值。这将避免对重复值求和导致无效结果
SELECT p.id,
p.title,
COALESCE(v.totalView, 0) totalView,
COALESCE(u.totalUpvote, 0) totalUpvote
FROM posts p
LEFT JOIN
(
SELECT post_id,
SUM(v.value) totalView
FROM views v
GROUP BY post_id
) v ON p.id = v.post_ID
LEFT JOIN
(
SELECT post_id,
SUM(u.value) totalUpvote
FROM upvotes u
GROUP BY post_id
) u ON p.ID = u.post_ID
SELECT * FROM(SELECT posts.title,
SUM(views.value) AS views
FROM posts
LEFT OUTER JOIN views ON (posts.id = views.post_id)
GROUP BY posts.id)as x
JOIN(
SELECT posts.title,
SUM(upvotes.value) AS upvotes
FROM posts
LEFT OUTER JOIN upvotes ON (posts.id = upvotes.post_id)
GROUP BY posts.id)as y on x.title=y.title