0

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

产品  
 - ID
 - 标题

product_rating
 - product_id
 - 评分

产品视图
 - product_id

我想用它们的评级(可以是 +1 或 -1 值)和它们的总产品数来获取产品。

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 个视图。我理解它为什么会发生(它是对每个 product_view 的评分求和),但我不知道如何解决它。

任何建议将不胜感激。


样本数据:

产品
------------
编号 | 标题  
1 | 格洛伯  

product_rating
------------------
产品编号 | 评分  
1 | 1  

产品视图
------------
product_id  
1  
1  
1  
1  
1  
1  
1  
1  
1  
4

2 回答 2

3

尝试

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

样本输出:

| 身份证 | 标题 | 评级 | 意见 |
---------------------------------
| 1 | 全球 | 1 | 9 |

这是SQLFiddle演示

于 2013-06-22T04:23:26.803 回答
0

怎么做?

SELECT tbl.pid,tbl.ptitle, SUM(tbl.rating) as Rate, COUNT (tbl.views) as ViewList FROM (SELECT 
p.`id` as pid, p.`title` as ptitle,
pr.`rating` AS rating, 
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` ) ) as tbl
GROUP BY 
tbl.`pid`
ORDER BY tbl.Rate DESC
于 2013-06-22T04:26:12.163 回答