现在出现一个问题,就是用户分为上下级关系,之前的数据中用户名称是唯一键,新系统里面使用手机号作为唯一键,现在需要将原有数据搬迁到新系统里面来,需要排除所有手机号出现的多次的数据。并且将手机号相同的用户下级关系绑定到需要删除的用户的上级来
即关系紧缩
下面用一张图来描述问题
如图所示,用户呈现上图关系图谱,当前B和D手机号相同,我们需要将D干掉,并且把F绑定到B下面
首先我们分析问题。
首先我们需要将所有需要删除的用户查询出来
- 查询出所有用户的数据
- 通过手机号分组查出实际需要插入新系统的数据
两个查询出来的数据差就是需要优化的用户数据
然后将数据差的上下级关系优化
具体实现代码
<?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;
}
}