0
点赞
收藏
分享

微信扫一扫

树结构紧缩 删除指定节点 保留树结构关系


现在出现一个问题,就是用户分为上下级关系,之前的数据中用户名称是唯一键,新系统里面使用手机号作为唯一键,现在需要将原有数据搬迁到新系统里面来,需要排除所有手机号出现的多次的数据。并且将手机号相同的用户下级关系绑定到需要删除的用户的上级来
即关系紧缩

下面用一张图来描述问题

树结构紧缩 删除指定节点 保留树结构关系_数据


如图所示,用户呈现上图关系图谱,当前B和D手机号相同,我们需要将D干掉,并且把F绑定到B下面

首先我们分析问题。
首先我们需要将所有需要删除的用户查询出来

  1. 查询出所有用户的数据
  2. 通过手机号分组查出实际需要插入新系统的数据

两个查询出来的数据差就是需要优化的用户数据
然后将数据差的上下级关系优化

具体实现代码

<?php
define('TABLE','my_user2');

$dbh = new PDO('mysql:host=localhost;dbname=jfh', 'root', '123456');

$arr_all = $dbh->query("SELECT * FROM ".TABLE)->fetchAll(PDO::FETCH_ASSOC);//全部用户

$arr_true = $dbh->query('SELECT * FROM '.TABLE.' GROUP BY phone ORDER BY id asc')->fetchAll(PDO::FETCH_ASSOC);//有效用户

$insert_Arr = array();

foreach ($arr_all as $k => $row){

    //判断当前用户是不是在有效用户里面
    if(!in_array($row,$arr_true)){
//        //直接把下级拿出来取上级别 拿最新的数据
        $sql = "SELECT * FROM ".TABLE." where id = '{$row['id']}'";
        $data = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
        $res = queryByMarkCode($data[0]['my_mark_code'],$data[0]['mark_code'],$dbh);

    }
}

function queryByMarkCode($my_mark_code,$mark_code,$dbh){

    $res = $dbh->query("SELECT * FROM ".TABLE." where mark_code='{$my_mark_code}'")->fetchAll(PDO::FETCH_ASSOC);//全部用户

    //下级没有了  直接删除自己
    if(empty($res)){

        return null;

    }else{
        foreach ($res as $k => $row){
            //修改数据库文件
            $sql = "update ".TABLE." set mark_code = '{$mark_code}' where id = {$row['id']}";
            echo $sql;
            $dbh->exec($sql);
        }

        return true;

    }
}


举报

相关推荐

0 条评论