[英]Query help needed — aggregates and multiple joins
我的应用程序中有几个表。 一个维护一个产品列表,另一个维护对那些项目的评论,另一个维护那些项目的星级,最后一个维护那些项目的购买。 我的表如下所示:
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;
使用count(distinct(tbl_purchases.id))
应该可以解决您的问题,而无需其他人提供的更复杂的查询(但也是正确的)。
这将在某种程度上取决于您使用的是什么数据库,但这在PostgreSQL中不起作用:
SELECT d.id , p.count, c.count, AVG(I.rating)
FROM tbl_item d
JOIN ( SELECT count(id), item_id as id from tbl_purchases ) as P
USING (id)
JOIN ( SELECT count(id), item_id as id from tbl_comment ) as C
USING (id)
LEFT JOIN tbl_rating as I
ON tbl_rating.id = d.id
GROUP BY d.id
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.