依次从两个不同的表中减去两列

时间:2019-06-27 17:21:15

标签: mysql sql join view

我有两个表twentyBuyertwentySeller,在两个表中,我都有多个列,但我想拉出的是totalCost。我一直在尝试找出一种方法,以便可以依次从twentyBuyer.totalCost中减去twentySeller.totalCost。这些表格如下所示。

TABLE二十买方

ID, Date,        Name,   TotalCost, Type
1,  "today",     "John", 46,        "ONE"
2,  "yesterday", "Doe",  506,       "ONE"

表格二十位卖家

ID, Date,        Name,     TotalCost, TYPE
1,  "today",     "Franko", 273,       "ONE"
2,  "yesterday", "Bob",    207,       "ONE"

起初,我尝试使用SELECT语句提取信息,所以我可以很容易地将减法运算减到SELECT twentyBuyer.totalCost - twenty_seller.totalCost FROM twentyBuyer, twenty_seller;

diff
299
-161
233
-227

我认为这种方式是错误的,因此我用Google搜索了一些并遇到了联接。当我开始使用INNER JOIN时,我几乎得到了正确的结果,但又有两个结果

代码:

SELECT DISTINCT twenty_seller.totalCost, twentyBuyer.totalCost
FROM twenty_seller
LEFt OUTER JOIN twentyBuyer
ON 1=1;


totalCost | totalCost
207       | 506
273       | 506
207       | 46
273       | 46 

我试图在其中添加UNIQUE,但似乎没有任何效果。然后我切换到视图,但是遇到类似的问题。我删除了视图代码,但遇到了类似问题。

我希望结果像

difference
-227
299 

如果这是一个琐碎的问题,我深表歉意,但是我只是无法弄清楚该如何做,我认为有一个简单的解决方案我还没有想到。任何帮助表示赞赏

2 个答案:

答案 0 :(得分:0)

数据库不会尝试匹配两个表中的行-它执行笛卡尔积(即,将第一张表中的每一行与第二张表中的每一行匹配),并且要由您提供条件告诉数据库如何连接这些行。

在第一个示例中,您没有条件,因此得到2 * 2 = 4行。这称为交叉联接。 在第二个示例中,条件1 = 1始终计算为true,因此尽管不喜欢它,但它也是一个交叉联接,并产生与第一个查询相同的结果。

假设您要匹配具有相同ID的行,则需要提供以下逻辑作为条件:

SELECT td.id, ts.totalCost - tb.totalCost
FROM   twenty_seller ts
JOIN   twentyBuyer tb ON ts.id = tb.id;

答案 1 :(得分:0)

您正在寻找带有一些数学运算的“ AS”子句。

您也不给它任何匹配的列,这意味着两个表中的所有行都将照原样返回。

您可以通过为它指定一个特定的列来解决此问题。

像这样:

SELECT 
  twenty_seller.totalCost AS 'cost1',
  twentyBuyer.totalCost AS 'cost2',
  twenty_seller.totalCost-twentyBuyer.totalCost AS 'Difference'
FROM twenty_seller
LEFT OUTER JOIN twentyBuyer ON twenty_seller.ID=twentyBuyer.ID; 

或者,如果您只想区别:

SELECT 
  twenty_seller.totalCost-twentyBuyer.totalCost AS 'Difference'
FROM twenty_seller
LEFT OUTER JOIN twentyBuyer ON twenty_seller.ID=twentyBuyer.ID; 

如果您希望所有行的总数:

SELECT 
  SUM(twenty_seller.totalCost)-SUM(twentyBuyer.totalCost) AS 'Difference'
FROM twenty_seller
LEFT OUTER JOIN twentyBuyer ON twenty_seller.ID=twentyBuyer.ID;