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
相关产品推荐
相关产品推荐

