2010-12-10 147 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