首页 > 解决方案 > 遍历指针字段的 MySQL 查询

问题描述

由于一些遗留代码,我有 2 个 MySQL 表,其结构如下(简化):

Invoice (ID, InvoiceNo, First_Item)

InvoiceItem (ID, Details, Next_Item)

显然,每个 Invoice 都有很多 InvoiceItem。

旧版应用程序希望您首先加载 Invoice 行,然后使用 Invoice 的 First_Item 值加载 InvoiceItem 表中的第一项。要获取每个连续的 InvoiceItem 行,您将遵循其 Next_Item 值,直到您遇到空值。

有没有办法编写 MySQL SQL 来恢复给定 Invoice 的所有 InvoiceItem(s)?即跟随Invoice 的First_Item 然后遍历所有Invoice_Items 的Next_Item 指针。

谢谢比尔。

标签: mysql

解决方案


你想做一个递归查询,但 mysql<8 不支持它。

这是一个适用于您的小数据集的解决方案(来自 sqlfiddle)

select  id,
        details , 
        next_item
from    (select * from invoiceitem
         order by id ) inv_itm,
        (select @iis := 0 )  init
where   find_in_set(id, @iis)
and not find_in_set(9999999999, @iis)
and     length(@iis := concat(@iis, ',', ifnull(next_item,9999999999))) ;

此解决方案只有在每个发票的项目 id 都按升序排列时才有效。

该解决方案的灵感来自如何创建 MySQL 分层递归查询

您需要计划升级到 5.7 或 8.0,因为下面您将很快没有安全更新。

https://en.wikipedia.org/wiki/MySQL#Release_history


推荐阅读