我有4个表格:项目,订单,inventory_item和库存。它们的结构如下:
_________ ____________ ________________ _____________
| orders | >---- | items | ----< | inventory_item | >---- | inventories |
|- - - - -| |- - - - - - | |- - - - - - - - | |- - - - - - -|
|+item_id | |+id | |+id | |+id |
|+amount | |+group_id | |+inventory_id | -------------
--------- |+worth | |+item_id |
|+min_amount | |+amount |
------------ ----------------
无需查询库存表,仅显示该表是为了了解结构。
我想使用一个与MariaDB兼容的sql查询,并执行以下操作:按清单和group_id显示分组:
我试图通过子查询来解决这个问题,但这似乎是没有希望的。我目前的尝试如下所示:
SELECT
`inventory_item`.`inventory_id`,
`items`.`group_id`,
SUM(`items`.`min_amount`),
SUM(`inventory_item`.`amount`),
SUM(`inventory_item`.`amount` * `items`.`worth`),
SUM(`orders`.`amount`)
FROM `items`
INNER JOIN `inventory_item` ON `items`.`id` = `inventory_item`.`item_id`
LEFT JOIN `orders` ON `items`.`id` = `orders`.`item_id`
GROUP BY
`inventory_item`.`inventory_id`,
`items`.`group_id`
SUM(orders.amount)值实际上是正确的,但其他值是错误的,因为一项被多次计数。
我知道如何用多个查询来解决这个问题,但是我只想用一个(兼容MariaDB的)SQL查询来解决。知道怎么做吗?
您需要沿着一个维度预先汇总结果。我认为您可以通过预先聚合来做到这一点orders
:
SELECT ii.inventory_id, i.group_id,
SUM(i.min_amount),
SUM(ii.amount),
SUM(ii.amount * i.worth),
SUM(i.amount)
FROM items i JOIN
inventory_item ii
ON i.id` = ii.item_id LEFT JOIN
(SELECT o.item_id, SUM(o.amount) as amount
FROM orders o
GROUP BY o.item_id
) o
ON o.item_id = i.id
GROUP BY ii.inventory_id, i.group_id
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句