2014-04-21 1 views
0

3 개의 테이블에서 항목의 수와 비율을 계산하려고합니다.3 테이블이있는 항목 계산

테이블 :

categories 
cat_id | title 
1  | phone 
2  | tablet 

products 
prod_id | cat_id | title 
1001  | 1  | iphone 
1002  | 1  | nokia 
1003  | 1  | blackberry 
1004  | 2  | ipad 

user_products 
id  | prod_id | user_id 
1  | 1001  | 1 
2  | 1001  | 2 
3  | 1001  | 3 
4  | 1003  | 3 
5  | 1004  | 4 

내가 지금까지 가지고 :

Tablets: 
Ipad  | 1 | 100% 

Phones: 
Iphone  | 3 | 75% 
Blackberry | 1 | 25% 
+0

질문이 있으십니까? 왜냐하면 지금 당신은 당신이 시도한 것을 진술하고 있습니다. –

+0

'settings_preferences '란 무엇입니까? 그게 '제품'일까요? – Barmar

+0

@barmar thanks! –

답변

2
SELECT c.cat_id, c.title AS cat_name, p.prod_id, p.title AS prod_name, 
     COUNT(*) AS cnt, 
     100*COUNT(*)/cat_total AS pct 
FROM products AS p 
INNER JOIN user_products AS up ON p.prod_id = up.prod_id 
INNER JOIN (SELECT c.cat_id, c.title, COUNT(*) AS cat_total 
      FROM categories AS c 
      JOIN products AS p ON c.cat_id = p.cat_id 
      JOIN user_products AS up ON up.prod_id = p.prod_id 
      GROUP BY c.cat_id) AS c ON c.cat_id = p.cat_id 
GROUP BY p.prod_id 
ORDER BY cat_name, cnt DESC 

DEMO

+0

질문을 편집하여 성능 측면에서 다른 답변을 비교해 볼 수 있습니까? 그것은 우리 모두에게 매우 도움이 될 것입니다. 건배! –

+0

벤치 마크를 수행하기 위해서는 많은 수의 행이있는 데이터베이스가 필요하며 하나도 가지고 있지 않습니다. – Barmar

1

시도 :

SELECT categories.cat_id, products.title, COUNT(products.title) AS cnt 
FROM categories 
LEFT JOIN products ON categories.cat_id = products.cat_id 
GROUP BY products.title 

원하는 결과를

SELECT categories.cat_id, products.title, COUNT(user_products.id) AS cnt, ROUND((( COUNT(user_products.prod_id)/ ( SELECT COUNT(user_products.id) FROM user_products INNER JOIN products ON products.prod_id = user_products.prod_id WHERE products.cat_id = categories.cat_id GROUP BY products.cat_id )) * 100), 2) as percent FROM user_products INNER JOIN products ON products.prod_id = user_products.prod_id INNER JOIN categories ON categories.cat_id = products.cat_id GROUP BY products.prod_id, categories.cat_id 
1

여기 당신은 간다!

SELECT c.title AS category, p.title AS device, 
COUNT(up.prod_id) AS totalDevices,(COUNT(up.prod_id)/totNumDev)*100 AS percent 
FROM user_products AS up , products AS p , categories AS c, 

(SELECT _p.cat_id AS q2Cat, COUNT(_up.prod_id) AS totNumDev 
FROM user_products AS _up, products AS _p WHERE _p.prod_id = _up.prod_id 
GROUP BY _p.cat_id) AS query2 

WHERE p.prod_id = up.prod_id AND c.cat_id = p.cat_id AND query2.q2Cat = c.cat_id 
GROUP BY up.prod_id;