我有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
我需要所有销售计数和特定产品的所有链接计数
我怎样才能做到这一点?
由于
答案 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)
答案 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
不是有史以来最有效的查询,但只要表格不包含大量行和/或您将其作为定期报告运行而不是实时数据,就完全可以。
最好的办法是亲自测试一下,看看性能是否可以接受。