MySQL自我加入条款(递增ID)

时间:2018-01-08 22:06:13

标签: mysql join inner-join

我有一个名为“stock”的表,其记录如下所述

ID| Date       | Qty
1 | 2017-01-03 | 10
2 | 2017-02-11 | 15
3 | 2017-03-15 | 16
4 | 2017-04-25 | 30
5 | 2017-06-20 | 40

我想找到每个连续行的“数量”之间的差异。为此,我使用查询:

SELECT first_table.id as "First Table ID"
     , first_table.date AS "From"
     , first_table.qty AS "First Table Qty"
     , second_table.id as "Second Table ID"
     , second_table.date AS "To"
     , second_table.qty AS "Second Table Qty"
     , (second_table.qty - first_table.qty) AS Quantity_Difference 
  FROM stocks first_table 
  JOIN stocks second_table 
    ON first_table.id + 1 = second_table.id

以下描述了我从上述查询得到的结果。

link

我的问题是:

1)在上面的查询中,条款first_table.id + 1 = second_table.id是什么意思?

2)在JOIN子句中,我在first_table ID上添加“1”(即first_table.id + 1)。 但是,在我得到的结果中,为什么second_table ID会增加?我认为,通过在first_table ID中加1,应该递增的first_table ID而不是第二个表ID。

1 个答案:

答案 0 :(得分:2)

  

在上面的查询中,条款first_table.id + 1 = second_table.id是什么意思?

这意味着要加入ID不同1的表格中的行。

  

但是,在我得到的结果中,为什么second_table ID会增加?

它没有递增ID,它在一行的ID上加1,并将其与另一行的ID进行比较。当first_table.id = 2first_table.id + 13时,它会与second_table.id = 3一起加入该行。

添加仅在WHERE子句中完成,您不会在SELECT列表中返回结果。因此,它会选择原始first_table.id,而不是first_table.id + 1

如评论中所述,此查询仅在ID全部按1递增时才能正常工作。如果ID序列中存在任何间隙,您将跳过间隙前的first_table.id和间隙后的second_table.id。有关从不依赖于ID的相邻行中减去值的更好方法,请参阅Subtract Quantity From Previous Row MySQL