【问题标题】:MySQL Self-Join Clause (Incrementing ID)MySQL 自连接子句(递增 ID)
【发布时间】:2018-01-08 22:06:13
【问题描述】:

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

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

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

我的问题是:

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 应该增加而不是第二个 table ID。

【问题讨论】:

  • first_table.id + 1 = second_table.id 请求 id 比 first_table 记录多一个的 second_table 记录。
  • 以这种方式逐步加入一个 id 是灾难的根源。
  • 告诉编写该查询的人,AUTO_INCREMENT 列不能保证是连续的。
  • 嗨 Glorian 将您的第一个表实现为代码而不是图像。它很小,所以..花时间摆脱反对票。
  • @Strawberry 我加入了ID,因为这只是为了问这个问题:)

标签: mysql join inner-join


【解决方案1】:

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

表示连接表中ID相差1的行。

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

这不是递增 ID,而是将 1 加到一行的 ID 并将其与另一行的 ID 进行比较。当first_table.id = 2first_table.id + 13 时,它与second_table.id = 3 连接该行。

加法只在WHERE 子句中完成,您不会在SELECT 列表中返回结果。所以它选择原来的first_table.id,而不是first_table.id + 1

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

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 2021-08-21
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多