代码之家  ›  专栏  ›  技术社区  ›  Glorian

MySQL自连接子句(递增ID)

  •  1
  • Glorian  · 技术社区  · 8 年前

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

    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子句中,我在第一个\u table ID上添加了“1”(即first\u table.ID+1)。 但是,在我得到的结果中,为什么第二个表ID会递增?我认为,通过向第一个\u表ID添加1,第一个\u表ID应该递增,而不是第二个表ID。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Barmar    8 年前

    在上面的查询中,子句 first_table.id + 1 = second_table.id 意思是

    这意味着将表中ID不同的行连接起来 1 .

    但是,在我得到的结果中,为什么第二个表ID会递增?

    它不是递增ID,而是向一行的ID中添加1,并将其与另一行的ID进行比较。什么时候 first_table.id = 2 , first_table.id + 1 3 ,因此它将该行与 second_table.id = 3 .

    仅在 WHERE 子句中返回的结果 SELECT 列表所以它选择了原始的 first_table.id 第一张表。id+1 .

    如注释中所述,只有当IDs all递增时,此查询才能正常工作 1. . 如果ID序列中有任何间隙,您将跳过 第一张表。身份证件 间隙前和 second_table.id 在间隙之后。看见 Subtract Quantity From Previous Row MySQL 为了更好地从相邻行中减去不依赖于顺序ID的值。

    推荐文章