【发布时间】:2017-01-06 15:08:52
【问题描述】:
我正在尝试编写一个查询,该查询将生成一个商家列表,然后计算他们拥有多少库存商品以及每个商家有多少订单。 Merchants、Inventory Items 和 Orders 都在不同的表格中。我希望返回看起来像这样:
Site | Inventory Items | Orders
London | 7282 | 1234996
Glasgow | 9829 | 734949
我可以通过这个查询几乎立即获得站点和库存计数列表:
SELECT M.name AS 'Site',
COUNT(II.idInventoryItems) AS 'Inventory Items',
FROM Merchants M
JOIN
(SELECT idMerchants,
idInventoryItems
FROM InventoryItems) AS II ON II.idMerchants = M.idMerchants
GROUP BY M.name
我可以通过非常相似的查询获得站点和订单列表。但是当我将两者结合起来时,查询会无限期挂起,我必须取消查询。这是我一直在使用的完整查询:
SELECT M.name AS 'Site',
COUNT(II.idInventoryItems) AS 'Inventory Items',
COUNT(O.idOrders) AS 'Orders'
FROM Merchants M
JOIN
(SELECT idMerchants,
idInventoryItems
FROM InventoryItems) AS II ON II.idMerchants = M.idMerchants
JOIN
(SELECT idMerchants,
idOrders
FROM Orders) AS O ON O.idMerchants = M.idMerchants
GROUP BY M.name
通过相当快的查询可以实现我想要做的事情吗?如果是这样,我做错了什么?
【问题讨论】:
-
你检查索引了吗?
-
另外,你真的需要使用子查询吗?你不能简单地加入 Orders 和 InventoryItems 吗?据我所知,MySQL 并没有真正针对子查询进行优化
-
@Sebastianb 由于
M和II和M和O之间的1:M 关系,这里需要子查询。在Orders和InventoryItems之间发生的多对多会人为地增加计数,从而提供不正确的计数;因此子查询需要首先获得计数然后加入。这就是为什么我相信克里斯的回答会奏效。