2010-12-10 150 views
1

我有3個表MySQL的多個表的計數查詢

products 
    productid (int) 
    name (varchar) 
    price (float) 

sales 
    salesid (int) 
    productid (int) 
    time (datetime) 

links 
    linkid (int) 
    productid (int) 
    link (text) 

現在我需要一個可以顯示爲

ProductID  ProductName  Sales  Links 
    1   ABC    10  8 
    2   XYZ    15  12 

我需要所有的銷售數量和所有鏈接數特定產品的查詢

我該如何做到這一點?

謝謝

+0

出於好奇,這是什麼? – outis 2010-12-10 12:57:50

回答

0

您需要編寫一個交叉表查詢。

這個walk-through對mysql網站應該有所幫助。

或者like in this tutorial

+0

是否優化? – 2010-12-10 11:53:57

+0

我已經添加了官方mysql站點如何解決這種類型的問題 - 這是一個絕對優化的鏈接。 – amelvin 2010-12-10 11:58:06

+0

我試過了,但是沒有工作 – 2010-12-10 12:16:12

3
SELECT p.productid, p.pname AS ProductName, 
     Count(DISTINCT s.salesid) as Sales, Count(DISTINCT l.linkid) as Links 
FROM products p 
    LEFT JOIN sales s ON p.productid=s.productid 
    LEFT JOIN links l ON p.products=l.productid 
GROUP BY p.productid 
+0

不能正常工作,顯示數量相同 – 2010-12-10 12:14:23

+0

「count same」是什麼意思?您的意思是「銷售」和「鏈接」列在每行中顯示相同的計數? – outis 2010-12-10 13:00:00

+0

爲第一次加入,如果它是左連接則計數相同 – 2010-12-10 13:16:36

0

只能在GROUP BY子句中指定的列使用聚合函數(如Count()),否則聚集是模糊的。請參閱優秀書SQL Antipatterns中的「不明確組」一章以獲取更多參考。

在你的情況下,最好的選擇是使用兩個子查詢:

SELECT p.productid as ProductID, p.pname AS ProductName, 
     (SELECT Count(*) FROM sales s WHERE p.productid=s.productid) as Sales, 
     (SELECT Count(*) FROM links l WHERE p.productid=l.productid) as Links, 
    FROM products p 
    GROUP BY p.productid 

不是最有效的查詢寫過,但它只要在表格完全可以不包含一個龐大的數字的行和/或你運行它作爲定期報告,而不是實時的實時數據。

最好的辦法是自己測試一下,看看性能是否可以接受。

+0

感謝您的幫助 – 2010-12-10 13:22:52