如何在连接表上查询COUNT并返回BOTH count = 0 AND count> 0的记录

问题描述 投票:0回答:2

我有一个Products表和一个Reviews表。 我想写一个查询来返回每个产品评论的COUNT和AVG。 如果没有评论,我希望它为COUNT和AVG返回0 / null。

产品表

+--------+----------+
| prodId | prodName |
+--------+----------+
|   1    |  apple   |
|   2    |  banana  |
|   3    |  cacao   |
+--------+----------+

评论表

+----------+----------+--------+
| reviewId |  prodId  | rating |
+----------+----------+--------+
|    1     |     1    |    1   |
|    2     |     1    |    1   |
|    3     |     2    |    5   |
|    4     |     2    |    5   |
+----------+----------+--------+

这就是我想要的结果:

+--------+----------+--------+-------+
| prodId | prodName |   avg  | count |
+--------+----------+--------+-------+
|   1    |  apple   |    1   |   2   |
|   2    |  banana  |    5   |   2   |
|   3    |  cacao   |   null |   0   |
+--------+----------+--------+-------+

我可以获得带有评论的产品的COUNT和AVG

SELECT p.prodid, p.prodname, avg(r.stars), count(r.productid)
FROM products p 
INNER JOIN reviews r ON p.productid=r.productid 
GROUP BY p.productid
+--------+----------+--------+-------+
| prodId | prodName |   avg  | count |
+--------+----------+--------+-------+
|   1    |  apple   |    1   |   2   |
|   2    |  banana  |    5   |   2   |
+--------+----------+--------+-------+

我也可以获得没有评论的产品的COUNT和AVG

SELECT p.prodid, p.prodname, avg(r.stars), count(r.stars)
FROM products p
LEFT OUTER JOIN reviews r 
ON (p.productid=r.productid) WHERE r.productid IS NULL
GROUP BY p.productid
+--------+----------+--------+-------+
| prodId | prodName |   avg  | count |
+--------+----------+--------+-------+
|   3    |  cacao   |   null |   0   |
+--------+----------+--------+-------+

但我不知道MySql是否有办法查询和计算匹配的结果,并计算在一个查询中没有匹配的结果。

mysql jointable
2个回答
0
投票

只需从第二个查询中删除where condition即可

SELECT p.prodid, p.prodname, avg(r.stars), count(r.stars)
FROM products p
LEFT OUTER JOIN reviews r 
ON p.productid=r.productid
GROUP BY p.productid,p.prodname

0
投票

在实践中,MySQL“LEFT JOIN”与LEFT OUTER JOIN相同。 OUTER关键字是可选的。要实现结果,您只需要执行简单的“LEFT JOIN”并按ID(或任何其他唯一键)进行分组:

SELECT 
    `p`.`prodId` AS `ID`, 
    `p`.`prodName` AS `Product`, 
    avg(`r`.`rating`) AS `AVG Rating`, 
    count(`r`.`reviewId`) AS `Vote Count`
FROM `products` AS `p`
LEFT JOIN `reviews` AS `r` ON `p`.`prodId` = `r`.`prodId`
GROUP BY `p`.`prodId`
© www.soinside.com 2019 - 2024. All rights reserved.