【问题标题】:subtract from two different table从两个不同的表中减去
【发布时间】:2013-09-03 23:59:42
【问题描述】:

我有 3 个表格“产品列表、销售、退货”,例如,我有 3 个销售和 2 个退货,如下所示。

这是来自productlist的ff数据

id | pcode | pname | pdesc | 
 1 |  222  | 33uf  | 10v   | 

这是来自sales的ff数据

id | pcode | total | profit
 1 |  222  |  200  |  10
 2 |  222  |  100  |  10
 3 |  222  |  200  |  10

这是返回的ff数据

id | pcode | total | lose
 3 |  222  |  200  |  10
 4 |  222  |  100  |  10

我的问题是这个。我想从产品列表中选择数据,sum 从销售中选择“总”和“利润”值,并从退货中求和“总”和“损失”值。然后减去我的两个表得到结果。预期的结果一定是这样的。

id | pcode | pname | pdesc | total | profit |
 1 |  222  | 33uf  | 10v   | 200   |  10    |

我有这个 ff 代码,但我不能从销售额中减去“总计”,从退货中减去“总计”,从销售额中减去“利润”,从退货中减去“亏损”。

$result = mysql_query("SELECT 
    productlist.*, 
    SUM(sales.total)-SUM(return.total) as total, 
    SUM(sales.profit)-SUM(return.lose) as profit

FROM productlist
LEFT JOIN sales ON sales.pcode = productlist.pcode AND return ON return.pcode = productlist.pcode
GROUP BY pcode
    ORDER BY total ASC");

【问题讨论】:

  • 你得到的错误是什么?
  • 什么是ff?并考虑提供一个 sqlfiddle。
  • “ff”表示“以下”

标签: php mysql


【解决方案1】:

您似乎试图用AND 连接两个表,这不太对;)

试试这个:

...
LEFT JOIN `sales` USING (`pcode`)
LEFT JOIN `return` USING (`pcode`)
...

我不完全确定这会起作用,它可能会抱怨column `pcode` is ambiguous。如果发生这种情况,请尝试以下方法:

...
LEFT JOIN `sales` ON `sales`.`pcode` = `productlist`.`pcode`
LEFT JOIN `return` ON `return`.`pcode` = `productlist`.`pcode`
...

【讨论】:

  • 即使没有正式的歧义,我总是觉得 USING 令人困惑!嘿,我是个诗人……
【解决方案2】:

您的查询结构不会返回正确的结果。无论您如何修正语法,您仍然会在给定产品的销售和退货之间获得笛卡尔积。

一种解决方法是在连接之前进行聚合:

SELECT pl.*,
       (coalesce(s.total, 0) - coalesce(r.total, 0)) as total,
       (coalesce(s.profit, 0) - coalesce(r.lose, 0)) as profit
FROM productlist pl left join
     (select pcode, sum(total) as total, sum(profit) as profit
      from sales
      group by pcode
     )
     on s.pcode = pl.pcode left join
     (select pcode, sum(total) as total
      from return
      group by pcode
     ) r
     on r.pcode = pl.pcode
ORDER BY total ASC;

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多