sql - 需要查询帮助——聚合和多重连接

标签 sql postgresql join count aggregate

我的应用程序中使用了几个表。一个维护产品列表,另一个维护对这些项目的评论,另一个包含这些项目的星级评级,最后一个包含这些项目的购买情况。我的表格看起来像这样:

tbl_item:
---------
id      INT (primary key)
name    VARCHAR (product name)

tbl_comment:
------------
id          INT (primary key)
item_id     INT (foregin key -> tbl_item.id)
commenttext VARCHAR

tbl_rating:
-----------
id          INT (primary key)
item_id     INT (foreign key -> tbl_item.id)
rating      DOUBLE

tbl_purchases:
--------------
id          INT (primary key)
item_id     INT (foreign key -> tbl_item.id)

我想执行一个返回以下内容的查询:

* The design ID
* The average rating
* The number of comments
* The number of purchases

我有类似的东西,但它返回了不正确的数据:

SELECT  d.id ,
        COUNT(tbl_purchases.id) AS purchase_count, 
        COUNT(tbl_comment.id) AS comment_count,
        AVG(tbl_rating.rating) AS item_rating,
    FROM tbl_item d
    LEFT JOIN tbl_purchases ON tbl_purchases.item_id = d.id
    LEFT JOIN tbl_comment ON tbl_comment.item_id = d.id
    LEFT JOIN tbl_rating ON tbl_rating.id = d.id
    GROUP BY d.id;

我发现我的 COUNT() 列为两列返回相同的值,这绝对不正确。显然我在连接或 GROUP BY 中做错了什么,但我不完全确定是什么。我是一个 Java 人员,而不是 SQL 人员,所以我不确定这个 SELECT 语句出了什么问题。

有人可以帮我构建这个查询吗?有没有办法以这种方式跨多个不同的表执行聚合查询?谢谢!!

最佳答案

试试这个:

SELECT  d.id ,
        COALESCE(t.purchase_count,0) as purchase_count, 
        COALESCE(c.comment_count,0) as comment_count,
        r.item_rating,
    FROM tbl_item d
    LEFT JOIN (SELECT item_id, COUNT(1) as purchase_count from tbl_purchases group by item_id) as t on t.item_id = d.id
    LEFT JOIN (SELECT item_id, COUNT(1) as comment_count from tbl_comment group by item_id) as c ON c.item_id = d.id
    LEFT JOIN (SELECT item_id, AVG(rating) as item_rating from tbl_rating group by item_id) as r ON r.item_id = d.id;

关于sql - 需要查询帮助——聚合和多重连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6497848/

相关文章:

sql - LINQ 连接 - 性能

mysql - MySQL包装连接条件与另一个条件?

mysql select multiple tables - 即使其他表为空,也返回结果

python - 使用带有 CTE 的联合时,由 sqlalchemy 生成的格式错误的查询

postgresql - 函数 json_object_agg(text, bigint) 不存在 postgres 9.2.4

mysql - 在 Lync 2010 LCSCDR 数据库中,他们是一种判断谁接听了响应组调用的方法

sql - 不存在的性能 - t-sql 查询

sql - 需要帮助创建 linq 选择

mysql - 如何不考虑时间按日期分组?

postgresql - gorm 不生成字符串列