从多个表获取数据的MySQL查询

从多个表获取数据的MySQL查询,mysql,Mysql,我有以下表格 1) 产品(产品ID、名称、说明、价格) 2) 销售(salesid、productid、buyername、BuyerMail、状态) 3) 产品视图(视图ID,产品ID) 现在,我需要一个可以输出为的查询 ProductIDProductNamePriceTotalViewsTotalSales 感谢您的帮助。您可以使用子查询获取浏览量和销售额: SELECT a.productid, a.name, a.price, (SELECT COUN

我有以下表格
1) 产品(产品ID、名称、说明、价格)
2) 销售(salesid、productid、buyername、BuyerMail、状态)
3) 产品视图(视图ID,产品ID)

现在,我需要一个可以输出为
的查询 ProductIDProductNamePriceTotalViewsTotalSales


感谢您的帮助。

您可以使用子查询获取浏览量和销售额:

SELECT 
    a.productid,
    a.name,
    a.price,
    (SELECT COUNT(b.viewid)
     FROM ProductViews b
     WHERE b.productid = a.productid) as TotalViews,
    (SELECT COUNT(c.salesid)
     FROM Sales c
     WHERE c.productid = a.productid) as TotalSales
FROM
    Products a
为了完整性起见,扩展了group by,但它只能是p.productid

Select p.ProductID, p.ProductName, p.Price, s.c as TotalSales, v.c as TotalViews
FROM Products p
INNER JOIN (select productid, count(*) as c from Sales group by productid) s 
   ON s.productId = p.productid
INNER JOIN (select productid, count(*) as c from ProductViews group by productid) v 
   ON p.productId = v.productid

如果您的产品没有销路或视图,则需要左键连接,而不是左键连接

销售表中是否有数量?或者是每笔销售一行?谢谢,但是这个查询是优化的还是我必须做一些事情来优化它?假设您在每个表上都有productid索引,这是您可能拥有的最优化的查询。子选择总是令人讨厌的。在本例中,所有3个表都应该在productid上有一个索引。这将使查询/连接变得超级快速,即使它们变得很大。始终正确索引您的表,并尽可能使用联接。谢谢,但是这个查询是优化的还是我必须做一些事情来优化它?这只是一种方法-使用解释或类似方法,并进行一些测试来找出答案。谢谢,但是这个查询是优化的还是我必须做一些事情来优化它?Gr8答案。但这不需要太多修改。请参阅我的答案。如果有适当的索引表,则用于汇总的子选择永远不会有效。这意味着什么?我想从你那里了解更多,你能详细说明一下吗@methodinAny sub select需要DB在内存中创建一个没有索引的临时表。这当然是非常缓慢的。处理此类查询的正确方法是在join子句中使用的列上为表编制索引,并使用内部/左侧联接和GROUP BY。请参阅我的答案,以便进一步阐述。在查询之前添加EXPLAIN,以查看数据库将做什么。
SELECT a.productid, a.name, a.price, (

SELECT COUNT( b.viewid ) 
FROM ProductViews b
WHERE b.productid = a.productid
) AS TotalViews, (

SELECT COUNT( c.salesid ) 
FROM Sales c
WHERE c.productid = a.productid
) AS TotalSales

FROM products a 
SELECT a.productid, a.name, a.price, (

SELECT COUNT( b.viewid ) 
FROM ProductViews b
WHERE b.productid = a.productid
) AS TotalViews, (

SELECT COUNT( c.salesid ) 
FROM Sales c
WHERE c.productid = a.productid
) AS TotalSales

FROM products a