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。这主意不错。我试试这个。谢谢。这一个有效!谢谢,在你写这篇文章之前,我已经试过了。不管怎样,除了别名,一切都是一样的。