开发者社区 问答 正文

用PHP从两个MySQL表的数据构建依赖关系树

我有两个表(建筑物和研究室)用于表A等游戏的技术树:(建筑物)+ id + building_name + research_needed + building_needed +

表B :(研究)+ id + research_name + research_needed + building_needed +

在两个表中,建筑物都是唯一的,但它们可以具有一个,两个或多个所需的建筑物/研究。

$sql = "SELECT * FROM researches WHERE c_need = '".$quell_bez."' OR r_need = '".$quell_bez."'";
$result = mysql_query($sql);
while($row = mysql_fetch_array($result))
{
    $i = 0;
    if($i == 0)
    {
        echo "<ul>";
        echo "<li>".$row['quell_bez']."</li>";
        buildTree($row['quell_bez']);
    }
    $i++;
    if($i > 0)
    {
        echo "</ul>";
    }
}
}
buildTree(building1);

表格无法更改。

我已经用一个表对递归函数进行了尝试(第一步起作用,因为在building1之后只是进行了研究),但是我不知道如何对两个表进行操作。有人对此有提示/灵魂吗?

展开
收起
社区秘书 2019-12-10 11:22:24 664 分享 版权
阿里云 AI 助理回答

要处理两个表之间的关联查询并构建递归树状结构,你可以使用SQL的JOIN操作来合并这两个表,并通过PHP递归函数展示结果。这里是一个基于你需求的简化示例:

首先,确保你的数据库连接使用的是PDO或MySQLi,因为mysql_*函数在PHP中已被废弃。以下代码示例将使用PDO。

  1. 建立数据库连接 (请替换your_db_name, your_username, your_password以及your_host为实际的数据库信息):
<?php
$host = 'your_host';
$db   = 'your_db_name';
$user = 'your_username';
$pass = 'your_password';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>
  1. 编写SQL查询以联接两个表:

假设我们需要找到所有直接或间接依赖于特定建筑物的研究和建筑物。我们可以用LEFT JOIN来实现这个目的,并且可能需要多次自我连接来获取多级依赖。

function fetchDependencies($baseId, $type = 'building') {
    $sql = "
        SELECT 
            r.id AS research_id, r.research_name AS name, r.building_needed AS dependency, 'research' AS type,
            b.id AS building_id, b.building_name AS name, b.research_needed AS dependency, 'building' AS type
        FROM 
            (
                SELECT id, building_name, research_needed AS dependency FROM buildings WHERE id = :baseId
                UNION ALL
                SELECT id, research_name, building_needed AS dependency FROM researches WHERE id = :baseId
            ) AS base
        LEFT JOIN buildings b ON base.dependency = b.id
        LEFT JOIN researches r ON base.dependency = r.id
    ";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':baseId' => $baseId]);
    return $stmt->fetchAll();
}
  1. 递归函数构建树结构:
function buildTree($item, &$tree = []) {
    // 假设初始调用时外部已传入基础ID
    if (!isset($tree[$item['id']])) {
        $tree[$item['id']] = [
            'name' => $item['name'],
            'type' => $item['type'],
            'dependencies' => [],
        ];
    }
    
    $dependencies = fetchDependencies($item['id'], $item['type']);
    foreach ($dependencies as $dependency) {
        if ($dependency['dependency']) { // 确保有依赖才继续递归
            buildTree($dependency, $tree[$item['id']]['dependencies']);
        }
    }
}

// 使用示例
$baseItemId = 'building1'; // 或者是某个研究的ID
$result = fetchDependencies($baseItemId);
foreach ($result as $item) {
    buildTree($item);
}

// 此时,$tree 变量包含了完整的依赖树结构
print_r($tree);

请注意,上述代码仅提供了一个基本框架,具体实现可能需要根据你的数据结构和需求进行调整。特别是递归逻辑部分,可能需要更细致地处理循环依赖等边缘情况。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答