You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP+MySQL如何判断父表记录是否存在关联的子表数据

关联父子表内容输出实现方案

现有结构说明

  • 父表parent_page:存储父页面数据,字段为id、page-title、page-content
  • 子表children_page:存储子页面数据,字段为child_id、parent_id、child-title、child-content,通过parent_id字段和父表id字段做关联

核心需求

查询父表所有数据按id倒序排列,遍历每条父记录时做判断:存在关联子记录则输出子内容,不存在则输出父内容。

原有代码问题

  • 判断逻辑位置错误:是否存在子记录的判断写在了子记录遍历循环内部,会导致重复执行判断、内容输出错乱
  • 直接拼接变量到SQL语句存在SQL注入风险
  • 未对查询结果做行数统计,无法直接判断关联子记录是否存在

正确实现代码

<?php
// 查询父表数据,按id倒序
$data = $conn->query("SELECT * FROM parent_page ORDER BY id DESC");
while($rows = $data->fetch(PDO::FETCH_OBJ) ):
    $parent_id = $rows->id;
    // 用预处理查询对应父id的子记录,避免SQL注入
    $child_stmt = $conn->prepare("SELECT * FROM children_page WHERE parent_id = ?");
    $child_stmt->execute([$parent_id]);
    // 判断子记录数量:大于0说明存在关联子记录
    if($child_stmt->rowCount() > 0){
        // 遍历输出所有子内容
        while($child_rows = $child_stmt->fetch(PDO::FETCH_OBJ) ){
            echo $child_rows->{'child-content'};
            // 可按需输出child-title等其他子表字段
        }
    }else{
        // 没有子记录,输出父内容
        echo $rows->{'page-content'};
        // 可按需输出page-title等其他父表字段
    }
endwhile;
?>

逻辑说明

  • 执行子表查询后,调用PDOStatement的rowCount()方法即可获取当前查询返回的子记录总数,返回值大于0即代表当前父记录存在关联子数据
  • 把判断逻辑放在子表查询之后、子记录遍历之前,避免重复判断,逻辑更清晰
  • 改用预处理传参的方式执行子表查询,从根源避免SQL注入风险

性能优化提示:数据量较大时,推荐使用联表查询一次性取出所有父子数据,避免循环中反复执行SQL造成的N+1查询问题,进一步降低数据库压力。

内容的提问来源于stack exchange,提问作者majan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:09:21