PHP查询MySQL多表生成GeoJSON出现重复行数据如何解决
你写的PHP数组构造逻辑本身没有错误,重复数据的根源是SQL查询语句的多表关联规则缺失。
问题原因
你当前使用的三表查询没有指定表之间的关联条件,会生成笛卡尔积:只要满足certification.ID=10002这个条件,就会把所有facilitator表的行、address表的行、符合条件的certification行做任意组合返回,自然会出现大量重复的用户数据。你可以直接在MySQL命令行或者可视化工具中执行你写的SQL语句,返回的三条结果本身就全是相同的Luz相关数据,PHP只是如实把查询结果转换成了GeoJSON格式。
解决步骤
1. 优先修正SQL语句,补充多表关联条件
根据三张表的外键关联规则修改查询语句即可,示例如下(可根据你实际的表字段设计调整关联条件):
// 示例关联逻辑:facilitator.address_id关联address表主键id,facilitator.certification_id关联certification表主键id $sql = "SELECT * FROM facilitator INNER JOIN address ON facilitator.address_id = address.id INNER JOIN certification ON facilitator.certification_id = certification.id WHERE certification.ID=10002 LIMIT 0,3";
2. 可选补充:业务层面去重
如果修正SQL后,业务场景依然允许存在重复行需要过滤,可以在推送数据到GeoJSON数组前做唯一性判断:
$geojson = array('type' => 'FeatureCollection', 'features' => array()); // 存储已入库的唯一标识,用姓名+经纬度组合判断重复 $existMark = []; while($row = mysqli_fetch_assoc($result)) { $uniqueKey = $row['First_Name'] . '_' . $row["Longitude"] . '_' . $row["Latitude"]; // 已存在的标识直接跳过 if (in_array($uniqueKey, $existMark)) { continue; } $existMark[] = $uniqueKey; $marker = array( 'type' => 'Feature', 'properties' => array( 'Name' => $row['First_Name'], ), 'geometry' => array( 'type' => 'Point', 'coordinates' => array( $row["Longitude"], $row["Latitude"] ) ) ); array_push($geojson['features'], $marker); }
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

