MySQL - SUM/COUNT 来自不同表的不同列

标签 mysql left-join aggregate-functions

我有一个特殊的问题。给定三个表。

product  
 - id
 - title

product_rating 
 - product_id
 - rating

product_view
 - product_id

I want to grab products with a SUM of their ratings (which will either be a +1 or -1 value) and their total product count.

SELECT 
    p.`id`, p.`title`,
    SUM( pr.`rating` ) AS rating, 
    COUNT( pv.`product_id` ) AS views 
FROM 
    `product` AS p 
    LEFT JOIN `product_rating` AS pr ON ( pr.`product_id` = p.`id` ) 
    LEFT JOIN `product_view` AS pv ON ( pv.`product_id` = p.`id` ) 
GROUP BY 
    p.`id`
ORDER BY rating DESC

在表格中,我有 1 个评分,9 个浏览量。但是,该查询返回 9 个评级和 9 个 View 。我理解为什么会发生这种情况(它是对每个 product_view 的评分求和),但我不知道如何解决这个问题。

如有任何建议,我们将不胜感激。


示例数据:

product
------------
id | title  
1  | Globber  

product_rating
-------------------
product_id | rating  
1          | 1  

product_view
------------
product_id  
1  
1  
1  
1  
1  
1  
1  
1  
1  

最佳答案

尝试

SELECT p.id, p.title, r.rating, v.views
  FROM product p LEFT JOIN
( 
  SELECT product_id, SUM(rating) rating
    FROM product_rating
   GROUP BY product_id
) r ON p.id = r.product_id LEFT JOIN
(
  SELECT product_id, COUNT(*) views
    FROM product_view
   GROUP BY product_id
) v ON p.id = v.product_id
ORDER BY r.rating DESC

示例输出:

| ID |   TITLE | RATING | VIEWS |
---------------------------------
|  1 | Globber |      1 |     9 |

这是 SQLFiddle 演示

关于MySQL - SUM/COUNT 来自不同表的不同列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17247245/

相关文章:

mysql - SQL COUNT() 函数和 LEFT OUTER JOIN

mysql - SQL查询查找对象的孙子

mysql - 在 Homestead 盒子上设置 phpmyadmin

mysql - 我可以选择不在 RIGHT JOIN 或 JOIN 中的行吗?

sql - 从大表中获取每个 parent 的最新 child - 查询太慢

sql - Postgres 的连胜记录

sql - 按时间戳聚合

mysql - 在SQL Cloud第二代中创建数据库

sql - 在 MySQL 中将某些字段/列的默认值设置为 NULL 是一种好习惯吗?

mysql - 表上左连接后 ID 丢失