0

私には独特の問題があります。与えられた 3 つのテーブル。

製品  
 - ID
 - 題名

product_rating
 - 製品番号
 - 評価

商品を見る
 - 製品番号

評価 (+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 ごとの評価を合計している)、回避する方法がわかりません。

どんな提案でも大歓迎です。


サンプルデータ:

製品
------------
ID | 題名  
1 | グロバー  

product_rating
-------------------
商品ID | 評価  
1 | 1  

商品を見る
------------
製品番号  
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

出力例:

| | ID | タイトル | 評価 | ビュー |
----------------------------------
| | 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 に答える