Как осуществить поиск похожих записей в mysql по возможному сходству 3 полей?

Доброго времени суток. Перейду сразу к вопросу.

Имеется таблица с полями: id, id_double, field_1, field_2, field_3

Поля: field_1, field_2, field_3 могут иметь одинаковые значения.

Существуют несколько дубликатов:

Дубликат 1 (по полю field_1 (или по field_2 или по field_3 или по всем 3-ем полям сразу))
Дубликат 2 (по полю field_2 (или по field_1 или по field_3 или по всем 3-ем полям сразу))

Теперь нужно произвести проверку среди имеющихся дубликатов, и если хотя бы одно поле совпадет, то эти два дубликата объединяются в группу.

PS желательно это привести в цикле, так как поиск производятся по всем записям в таблице и должен учитывать текущие изменения по дубликатам.
  • Вопрос задан
  • 3212 просмотров
Решения вопроса 1
@Snewer
При такой структуре таблицы:
57lHOluXw6A.jpg
Такой код получился:
$reg_name = 1; // имя пользователя
$reg_ip = 1; // ип адрес
$reg_phone = 1; // телефон


$q = mysqli_connect('localhost', 'root', '', 'bospor');

$arr_name = array($reg_name);
$arr_ip = array($reg_ip);
$arr_phone = array($reg_phone);

$arr_group = array();
$arr_id = array();
$stop = false;
while($stop == false){
	$sum1 = count($arr_name) + count($arr_ip) + count($arr_phone) + count($arr_group);
				
		$name = '';
		foreach($arr_name as $w){ $name .= "'$w',"; }
		$name =  mb_substr($name, 0, -1, 'utf-8');
		$ip = '';
		foreach($arr_ip as $w){ $ip .= "'$w',"; }
		$ip =  mb_substr($ip, 0, -1, 'utf-8');
		$phone = '';
		foreach($arr_phone as $w){ $phone .= "'$w',"; }
		$phone =  mb_substr($phone, 0, -1, 'utf-8');
		$group = '';
		foreach($arr_group as $w){ $group .= "'$w',"; }
		$group =  @mb_substr($group, 0, -1, 'utf-8');
				
		$sql = "SELECT * FROM `bospor_double` WHERE `user_name` IN($name) OR `user_phone` IN($phone) OR `user_ip` IN($ip)".( ( empty($group) ) ? '' : " OR `user_ip` IN($group) " );

		$res = $q->query($sql);
		$res = $res->fetch_all(MYSQLI_ASSOC);

		foreach($res as $w){
				  
			 if( !in_array(  $w['user_name'], $arr_name  ) ) $arr_name[] = $w['user_name'];
			if( !in_array(  $w['user_ip'], $arr_ip  ) ) $arr_ip[] = $w['user_ip'];
		        if( !in_array(  $w['user_phone'], $arr_phone  ) ) $arr_phone[] = $w['user_phone'];
			 if( !in_array(  $w['user_group_id'], $arr_group  ) ) $arr_group[] = $w['user_group_id'];
			if( !in_array(  $w['user_id'], $arr_id  ) ) $arr_id[] = $w['user_id'];
		}

				$sum2 = count($arr_name) + count($arr_ip) + count($arr_phone) + count($arr_group);
				
				if($sum1 == $sum2){
					$stop = true;
				}
				else {
					$sum1 = $sum2;
				}
}

$id = '';
foreach($arr_id as $w){ $id .= "'$w',"; }
$id =  mb_substr($id, 0, -1, 'utf-8');

				
// $id - ваш список пользователей
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@iamnothing
Я ничего не понял.
Ответ написан
Комментировать
Не могу додуматься до вопроса, поэтому прошу помощи. Спасибо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы