Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Поиск повторяющихся строк в многомерном массиве


Автор: rz3rr 11.5.2007, 15:24
Есть массив, получаемый из mysql-базы $array['indx']['num']['seria']['fio'], состоящий из 15000 строк. Вопрос - как можно найти повторяющиеся записи по полям [num]&&[serial]. Если подробнее - таблица, в которой записаны номер и серия паспорта и ФИО владельца паспорта. Необходимо найти все поля с повторяющимися номерами и сериями паспортов. Все найденные записи выводятся в визуалную таблицу. Прямой "тупой" перебор с сравнением полей не выходит - вылетает по таймауту (больше 300 сек). Как можно выйти из этой ситуации?

Автор: WolfON 11.5.2007, 17:31
Только не говорите мне, что вы всю базу из 15к строк грузите в массив О_О

Пока в голову пришел лишь такой способ выбора повторяющихся записей:
Код

SELECT * FROM `passport` WHERE `id` NOT IN (SELECT `id` FROM `passport` GROUP BY `seria`, `nomer`)

Автор: rz3rr 11.5.2007, 18:18
Да, все 15к, в них повторяющихся записей может штук 500 наберется...

Добавлено через 4 минуты и 6 секунд
WolfON, ваш вариант так же не прокатывает - вылетает по таймауту. Мысль в голову пришла - отсортировать по num и seria, последовательно пробегать по записям и сравнивать следующую строку на одинаковость (кроме indx естесссно).

Автор: mishaSL 11.5.2007, 19:05
rz3rr, эту задачу можно сделать на уровне SQL запроса. Покажите структуру вашей БД (точнее таблиц из которых идет выборка),  и код которым вы получаете данные (в том числе SQL запрос).

Автор: WolfON 11.5.2007, 19:19
Если база на Oracle - то PL/SQL в руки и все это делается за 5 минут

Если что-нибудь другое, то прийдется поколдовать, но в любом случае - придумать ничего хуже, чем грузить 15к записей - нельзя.
Используйте set_time_limit(0);

Хотя я все-таки настаиваю на решении этой задачи с помощью SQL.

Автор: rz3rr 12.5.2007, 08:50
База данных на mysql. Выборка производится только из одной таблицы где чуть более 40 полей. Запрос простой $qr=mysql_query("select indx,doc_serial,doc_number from persons_common where doc_serial!='' and doc_number!='');
Необходимо "выцепить" не только повторяющиеся записи, но и "с кем" они повторяются, для дальнейшей обработки.

Автор: Хрипа 12.5.2007, 12:32
Это элементарно
Сохраняишь массив в одну строку
типа $d .="\".$array[$i];
при помоши регов ишеш совпадения фразы 
Потом бьёш строку Explode 
И выводишь в цикле всё пользывателю в таблицу..
Надеюсь автоматически генирируймую таблицу сможешь сделать.
-*-----
Что бы быстрей работало сделай функцией

Автор: WolfON 12.5.2007, 13:25
Хрипа, представь сколько будет занимать памяти такая строка и сколько лет будет работать с ней регексп, а потом эксплод, если там 15000*(длина серии+длина номера) символов? )

Автор: rz3rr 12.5.2007, 17:18
Всё-таки, мысль, которая пришла ранее (отсортировать по num и seria, последовательно пробегать по записям и сравнивать следующую строку на одинаковость) оказалась на текущий момент самой быстрой - занимает около 3 секунд.

Автор: SelenIT 12.5.2007, 18:35
Требование единственного запроса критично?
Что, если сначала получить все повторяющиеся серии:
Код

SELECT `seria` FROM `passport` GROUP BY `seria` HAVING COUNT(*) > 1
собрать в массив (напр. $seria), потом аналогично собрать повторяющиеся номера ($numbers), а потом построить запрос
Код

$query = "SELECT * FROM `passport` WHERE `seria` IN ('".implode("','",$seria)."')
          UNION
          SELECT * FROM `passport` WHERE `number` IN ('".implode("','",$number)."')";

(предполагается, что оба поля проиндексированы)? Не окажется ли быстрее, по крайней мере с точки зрения нагрузки на mysql-клиента...

Автор: rz3rr 13.5.2007, 12:22
SelenIT, проиндексированы. Обработка производится на стороне mysql-сервера. Это разовая работа ("вычистить" таблицу от поторяющихся записей и поменять значения в связанных полях в других таблицах ). Пользователь к этому доступа иметь не будет. Это что-то администраторской функции. Дальнейшая задача уже будет не допускать ввода повторов (в обработчиках форм). К сожалению, разработка базы данных была произведена до меня. Я ограничен в возможностях модифицировать саму базу данных. А вот код обработки - да сколько угодно.
Ладно, всем спасибо за обсуждение -тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)