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