gpt4 book ai didi

php - 使用 MySQL 的有点分层的数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:07:31 25 4
gpt4 key购买 nike

我正在为一个工作项目处理一些有点层次结构的数据,并试图找到一种更有效的方法来处理它,因为我的第一次尝试可能在很多方面都很糟糕。我查看了该站点上的许多分层数据问题,因此我知道使用我的结构几乎不可能在单个查询中获取信息。

我要查询的表位于 AS/400 上,每个条目存储单个步骤的单个部分,因此如果我有 PartOne 和三个组件进入其中,每个条目都有一个条目,例如:

PartOne ComponentOne, PartOne ComponentTwo, PartThree ComponentThree.

重要的是要注意如果有 ComponentOne 的组件,后续行可能包含:

ComponentOne SubComponentOne, ComponentOne SubComponentTwo.  

考虑到这一点,我正在尝试为给定的成品部件获取树状结构中的所有组件,基本上获取最终产品中的所有内容。

我无法为此创建一个展平表,因为我要做的是动态生成该展平表。但是我确实可以访问成品列表。所以我现在的算法是这样的

  1. 获取零件号,查询表中的组件,当它是创建的零件。
  2. 将这些组件作为创建的部分进行查询并获取它们的组件。
  3. 重复直到查询不返回任何条目。

在本例中,深度为 7 个查询。我想知道外面的任何人都在寻找更好的算法是否对此有意义,而且自从我完成递归以来已经有一段时间了,但这至少在创建查询时对于递归来说似乎是合理的。考虑创建一个递归函数来传回每个级别的查询结果并在其中某处将信息存储在数组/表/数据库条目中是否合理?

最佳答案

你想要在 php 中使用树结构吗?那么下一个代码示例可能会很有趣。

这会为类别表中的记录构建一棵树,以 id -1000 作为根元素,只使用与您想要信息的层数一样多的查询。

表结构:

TABLE categories (
id INT NOT NULL PRIMARY KEY,
parent_id INT NULL,
name NVARCHAR(40) NOT NULL
)

PHP代码:

class Bom {
public $Id;
public $Name;
public $Components = array();

function __construct( $id, $name ) {
$this->Id = $id;
$this->Name = $name;
}
}

$parentIds = array( -1000 ); // List of id's to lookup
$rootBom = new Bom( -1000, 'Root' );
$bomsById[ -1000 ][] = $rootBom; // For each id there can be multiple instances if we want separate instances of Bom for each time it occurs in the tree
$maxLevel = 0;

while ( count( $parentIds ) > 0
&& $maxLevel++ < 10
&& $result = $mysqli->query( "SELECT * FROM categories WHERE parent_id IN ( " . implode( ", ", $parentIds ) . " ) ORDER BY name" ) )
{
$parentIds = array(); // Clear the lookup list
$newBomsById = array();
while ( $row = $result->fetch_assoc() )
{
$boms = $bomsById[ $row[ 'parent_id' ] ];
if ( $boms )
{
foreach ( $boms as $bomToUpdate )
{
$compontentBom = new Bom( $row[ 'id' ], $row[ 'name' ] );

$bomToUpdate->Components[] = $compontentBom;
$newBomsById[ $compontentBom->Id ][] = $compontentBom;
}

$parentIds[] = $row[ 'id' ]; // Build new list of id's to lookup
}
}

$bomsById = $newBomsById;
}

echo '<!--
' . print_r( $rootBom, true ) . '
-->';

关于php - 使用 MySQL 的有点分层的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27152692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com