MySQL多表计数查询

时间:2010-12-10 11:33:40

标签: sql mysql

我有3张桌子

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

我需要所有销售计数和特定产品的所有链接计数

我怎样才能做到这一点?

由于

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您需要编写交叉表查询。

mysql站点上的这个walk-through应该会有所帮助。

like in this tutorial

答案 2 :(得分:0)

您只能在Count()子句中指定的列上使用聚合函数(如GROUP BY),否则聚合不明确。有关详细信息,请参阅优秀书籍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

不是有史以来最有效的查询,但只要表格不包含大量行和/或您将其作为定期报告运行而不是实时数据,就完全可以。

最好的办法是亲自测试一下,看看性能是否可以接受。