mysql - 遍历指针字段的 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<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,因为下面您将很快没有安全更新。
推荐阅读
- php - 在 Laravel 6 中进行插入的最佳方法
- google-apps-script - GAS - 获取所有命名范围的脚本,包括受保护的范围 - 没有工作
- teamcity - 如何为 teamcity 代理安装附加软件?
- c# - c#中如何获取当前正在执行的方法的返回类型和返回类型的泛型?
- sql - 如何找到第二个和最大日期并比较这两个
- laravel - Laravel如何删除默认刀片
- r - R 绘图标题包含一个 url,但 pdf 导出中的超链接不起作用(“404”页面)
- javascript - Windows 应用程序可以让浏览器知道它的存在吗?
- python - 如何在Python中删除两个双括号之间的文本
- clickhouse - Superset 无法访问 ClickHouse 数据库