Mysql 具有多个联接的复杂查询
我试图做一个查询,从数据库中获取一些统计数据 我的表格结构如下所述:Mysql 具有多个联接的复杂查询,mysql,django,group-by,inner-join,Mysql,Django,Group By,Inner Join,我试图做一个查询,从数据库中获取一些统计数据 我的表格结构如下所述: PRODUCTS id | price | buy_price | vendor_code | ... ORDERS id | shipping_method_id | ... ORDER_ITEMS id | order_id | product_id | quantity | ... SHIPPING_METHODS id | cost | ... SUPPLIERS id | code | ... 我想得到这样
PRODUCTS
id | price | buy_price | vendor_code | ...
ORDERS
id | shipping_method_id | ...
ORDER_ITEMS
id | order_id | product_id | quantity | ...
SHIPPING_METHODS
id | cost | ...
SUPPLIERS
id | code | ...
我想得到这样的数据。换句话说,我正在制作关于我的电子商务产品总收入、费用和购买数量的报告,并希望它们按供应商分组。我写了以下sql:
SELECT orders.id,
suppliers.code,
COUNT(products.id)*items.quantity buys,
SUM(products.price*items.quantity + shipping_methods.cost) sales,
SUM(products.buy_price*items.quantity) expenses
FROM `orders` orders
INNER JOIN `order_items` items ON items.order_id = orders.id
INNER JOIN `products` products ON items.product_id = products.id
INNER JOIN (SELECT DISTINCT suppliers.code FROM `suppliers`) suppliers
ON products.vendor_code LIKE CONCAT(suppliers.code, '%%')
INNER JOIN `shipping_methods` shipping_methods ON orders.shipping_method_id = shipping_methods.id
WHERE (
orders.delivery_date_to BETWEEN '2011-11-18' AND '2011-11-19'
)
GROUP BY suppliers.code, orders.id
ORDER BY buys DESC
这将向我返回以下数据:
order_id code buys sales expenses
85 SB 4 1504 1111.32
84 VD 2 496 350.82
60 lg 2 1418 1052.31
88 SB 1 376 277.83
当我将GROUP BY suppliers.code,orders.id
更改为GROUP BY suppliers.code
时,它返回几乎正确的数据,我的意思是数据按代码分组,但计数错误。承认销售和费用是正确的
order_id code buys sales expenses
85 SB 8 1880 1389.15
60 lg 2 1418 1052.31
84 VD 2 496 350.82
如果你看到SB统计了总共8笔销售,但实际上只有5笔,正如你在上表中看到的那样。我确信我的问题中遗漏了一些东西,但我不明白如何纠正
PS field order_id在我的后续脚本中未使用,我使用它是因为django的Model.objects.raw()查询需要在结果中包含主键,我真的不明白为什么要尝试此查询
SELECT t1.code, SUM(t1.buys), SUM(t1.sales) FROM (
SELECT orders.id,
suppliers.code,
COUNT(products.id)*items.quantity buys,
SUM(products.price*items.quantity + shipping_methods.cost) sales,
SUM(products.buy_price*items.quantity) expenses
FROM `orders` orders
INNER JOIN `order_items` items ON items.order_id = orders.id
INNER JOIN `products` products ON items.product_id = products.id
INNER JOIN (SELECT DISTINCT suppliers.code FROM `suppliers`) suppliers
ON products.vendor_code LIKE CONCAT(suppliers.code, '%%')
INNER JOIN `shipping_methods` shipping_methods ON orders.shipping_method_id = shipping_methods.id
WHERE (
orders.delivery_date_to BETWEEN '2011-11-18' AND '2011-11-19'
)
GROUP BY suppliers.code, orders.id
ORDER BY buys DESC
) AS t1
GROUP BY t1.code
编辑:我忘记了SUM()部分。刚刚添加,如果已经尝试,请重试。表之间的所有关系都安全吗?供应商表中是否有一些记录与订单无关?事实上,供应商表与订单无关。有一个字段
code
,在产品表vendor\u code
中以该代码开头。例如,我的产品供应商代码是SB3418335、VDLC258810-8等等。问题是有两个单独的订单(订单id 85和88)。若要查看总计数,应首先去掉order_id列。例如,此查询不适用于MSSQL。这样分组时,应该排除这些字段。但是,这仍然不是你问题的解决办法。您可以尝试将整个查询与GROUP BY suppliers.code、orders.id一起用作innerSQL,并在outter SQL中创建第二个GROUP BY suppliers.code。这主意不错。我试试这个。谢谢。这一个有效!谢谢,在你写这篇文章之前,我已经试过了。不管怎样,除了别名,一切都是一样的。