2012-04-27 72 views
3

相關行我有3個表MYSQL計數2個表

products table 
productid productname 
--------- ----------- 
1   product 1 
2   product 2 
5   product 3 
10   product 4 
11   product 5 
12   product 6 

accounts_products table 
id productid accountid 
-- --------- --------- 
1 1   accountid 1 
2 10   accountid 2 
3 2   accountid3 

leads_products table 
id productid leadid 
-- --------- --------- 
1 1   leadid 1 
2 5   leadid 2 
3 2   leadid 3 

我想算一共有多少產品在leads_products和accounts_products基於相同的productid的表。

Expected result 

Product ID Product Name Total 
----------- ------------ -------- 
1    product 1   2 
2    product 2   2 
5    product 3   1 
10   product 4   1 

我試過到目前爲止

SELECT p.productid as 'Product ID', 
     p.productname as 'Product Name', 
     COUNT(*) as 'Total' FROM products p 
INNER JOIN leads_products l ON (l.productid=p.productid) 
INNER JOIN accounts_products a ON (a.productid=p.productid) 
GROUP BY p.productname,p.productid 

上面的查詢計數和顯示較大的數字比預期的。

我希望它是有道理的。

+4

什麼是錯的,你試過嗎? – 2012-04-27 18:04:17

+4

測試模式:http://www.sqlfiddle.com/#!2/f8472。使用OP的示例查詢:http://www.sqlfiddle.com/#!2/f8472/1 – mellamokb 2012-04-27 18:06:33

回答

8

試試這個:

SELECT p.productid as 'Product ID', 
     p.productname as 'Product Name', 
     (SELECT COUNT(*) 
     FROM leads_products AS l 
     WHERE l.productid = p.productid) + 
     (SELECT COUNT(*) 
     FROM accounts_products AS a 
     WHERE a.productid=p.productid) AS 'Total' 
FROM products AS p 

http://www.sqlfiddle.com/#!2/f8472/5

替代方法使用JOIN(更好的性能):

SELECT p.productid as 'Product ID', 
     p.productname as 'Product Name', 
     IFNULL(l.count, 0) + IFNULL(a.count, 0) as 'Total' 
FROM products AS p 
LEFT JOIN (
    SELECT productid, COUNT(*) AS count 
    FROM leads_products 
    GROUP BY productid 
) AS l 
ON l.productid = p.productid 
LEFT JOIN (
    SELECT productid, COUNT(*) AS count 
    FROM accounts_products 
    GROUP BY productid 
) AS a 
ON a.productid = p.productid 

http://www.sqlfiddle.com/#!2/f8472/33

+0

您能否提供解釋爲什麼OP的查詢沒有按預期執行? – eggyal 2012-04-27 18:09:54

+0

他正在計算交叉積,而不是總和。而不是1 + 1他得到1 * 1,而不是1 + 0他得到1 * 0。 – 2012-04-27 18:13:53

+0

@標記您的查詢幾乎可行。它顯示產品表中的每個記錄。如果沒有計數,則顯示計數爲0.任何想法? 感謝您的快速回復。 – librium 2012-04-27 18:16:02

-1

我用左手做了加入P的。產品保存所有的產品,然後計算公關在每個列表中列出並將它們添加到一起。先嚐試一下。可能有十億種方法來做到這一點。

SELECT p.productid 'Product ID', 
     p.productname 'Product Name', 
     COUNT(a.accountid) + COUNT(l.leadid) total 
FROM products p 
LEFT JOIN accounts_products a ON p.productid = a.productid 
LEFT JOIN leads_products l ON p.productid = l.productid 
GROUP BY p.productid 

http://www.sqlfiddle.com/#!2/f8472/37

+0

添加一個額外的行,它給出了錯誤的結果:http://sqlfiddle.com/#!2/8ca24/1 – 2012-04-27 18:20:30

+0

@MarkByers - 你自己檢查了嗎?我得到了OP的理想結果 – Scarecrow 2012-04-27 18:24:31

+0

@ Scarecrow736:他甚至將你與一個展示他的觀點的平臺聯繫起來。 -1 – eggyal 2012-04-27 18:25:02