【问题标题】:MySQL Query to fetch data from multiple tablesMySQL 查询从多个表中获取数据
【发布时间】:2010-11-24 13:02:39
【问题描述】:

我有以下表格
1) 产品(productid、名称、描述、价格)
2) 销售(salesid、productid、buyername、buyeremail、status)
3)ProductViews(viewid、productid)

现在,我需要一个可以输出为
的查询 ProductID     ProductName     价格     TotalViews     TotalSales

帮助感谢,谢谢。

【问题讨论】:

  • 销售表中有数量吗?还是每次销售一排?

标签: mysql


【解决方案1】:
SELECT p.productid, p.name, p.price, COUNT(pv.viewid) AS totalviews, COUNT(s.salesid) AS totalsales 
FROM Products p
LEFT JOIN Sales s ON s.productid = p.productid
LEFT JOIN ProductViews pv ON pv.productid = p.productid
GROUP BY p.productid, p.name, p.price

为了完整起见,扩展了 group by,但它可能只是 p.productid。

【讨论】:

  • 谢谢,但是这个查询是优化的还是我必须做一些优化它?
  • 假设您在每个表的 productid 上都有索引,这是您可能拥有的最优化的查询。子选择总是很讨厌。
  • 在这个例子中,所有 3 个表都应该在 productid 上有一个 INDEX。这将使查询/连接变得非常快,即使它们变得很大。始终正确索引您的表并尽可能使用 JOIN。
【解决方案2】:

您可以使用子查询来获取观看次数和销售额:

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

【讨论】:

  • 谢谢,但是这个查询是优化的还是我必须做一些优化它?
  • Gr8 答案。但这需要很少的修改。请参阅我的相同答案
【解决方案3】:
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

如果您的产品没有销售或视图,则需要离开加入

【讨论】:

  • 谢谢,但是这个查询是优化的还是我必须做些什么来优化它?
  • 这只是一种方法 - 使用解释或类似方法并进行一些测试以找出答案。
【解决方案4】:
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 

【讨论】:

  • 如果您有适当的索引表,则汇总的子选择永远不会有效。
  • 是什么意思?我想从你那里了解更多,你能详细说明一下吗@methodin
  • 任何子选择都需要数据库在内存中创建一个没有索引的临时表。这当然非常慢。处理此类查询的正确方法是在连接子句中使用的列上对表进行索引,并使用 INNER/LEFT JOIN 和 GROUP BY。请参阅我的答案以获取更多详细信息。在查询之前添加 EXPLAIN 以查看数据库将做什么。
猜你喜欢
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
相关资源
最近更新 更多