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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:54:02