我有两个表(建筑物和研究室)用于表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之后只是进行了研究),但是我不知道如何对两个表进行操作。有人对此有提示/灵魂吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
要处理两个表之间的关联查询并构建递归树状结构,你可以使用SQL的JOIN操作来合并这两个表,并通过PHP递归函数展示结果。这里是一个基于你需求的简化示例:
首先,确保你的数据库连接使用的是PDO或MySQLi,因为mysql_*
函数在PHP中已被废弃。以下代码示例将使用PDO。
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());
}
?>
假设我们需要找到所有直接或间接依赖于特定建筑物的研究和建筑物。我们可以用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();
}
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);
请注意,上述代码仅提供了一个基本框架,具体实现可能需要根据你的数据结构和需求进行调整。特别是递归逻辑部分,可能需要更细致地处理循环依赖等边缘情况。