![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
rz3rr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 27.11.2005 Репутация: нет Всего: нет |
Есть массив, получаемый из mysql-базы $array['indx']['num']['seria']['fio'], состоящий из 15000 строк. Вопрос - как можно найти повторяющиеся записи по полям [num]&&[serial]. Если подробнее - таблица, в которой записаны номер и серия паспорта и ФИО владельца паспорта. Необходимо найти все поля с повторяющимися номерами и сериями паспортов. Все найденные записи выводятся в визуалную таблицу. Прямой "тупой" перебор с сравнением полей не выходит - вылетает по таймауту (больше 300 сек). Как можно выйти из этой ситуации?
|
|||
|
||||
WolfON |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 604 Регистрация: 19.7.2004 Репутация: 6 Всего: 8 |
Только не говорите мне, что вы всю базу из 15к строк грузите в массив О_О
Пока в голову пришел лишь такой способ выбора повторяющихся записей:
|
|||
|
||||
rz3rr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 27.11.2005 Репутация: нет Всего: нет |
Да, все 15к, в них повторяющихся записей может штук 500 наберется...
Добавлено через 4 минуты и 6 секунд WolfON, ваш вариант так же не прокатывает - вылетает по таймауту. Мысль в голову пришла - отсортировать по num и seria, последовательно пробегать по записям и сравнивать следующую строку на одинаковость (кроме indx естесссно). |
|||
|
||||
mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
rz3rr, эту задачу можно сделать на уровне SQL запроса. Покажите структуру вашей БД (точнее таблиц из которых идет выборка), и код которым вы получаете данные (в том числе SQL запрос).
-------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
WolfON |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 604 Регистрация: 19.7.2004 Репутация: 6 Всего: 8 |
Если база на Oracle - то PL/SQL в руки и все это делается за 5 минут
Если что-нибудь другое, то прийдется поколдовать, но в любом случае - придумать ничего хуже, чем грузить 15к записей - нельзя. Используйте set_time_limit(0); Хотя я все-таки настаиваю на решении этой задачи с помощью SQL. |
|||
|
||||
rz3rr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 27.11.2005 Репутация: нет Всего: нет |
База данных на mysql. Выборка производится только из одной таблицы где чуть более 40 полей. Запрос простой $qr=mysql_query("select indx,doc_serial,doc_number from persons_common where doc_serial!='' and doc_number!='');
Необходимо "выцепить" не только повторяющиеся записи, но и "с кем" они повторяются, для дальнейшей обработки. |
|||
|
||||
Хрипа |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 11.12.2006 Репутация: -6 Всего: нет |
Это элементарно
Сохраняишь массив в одну строку типа $d .="\".$array[$i]; при помоши регов ишеш совпадения фразы Потом бьёш строку Explode И выводишь в цикле всё пользывателю в таблицу.. Надеюсь автоматически генирируймую таблицу сможешь сделать. -*----- Что бы быстрей работало сделай функцией --------------------
<Вырезана, как не соответствующая правилам форума > |
|||
|
||||
WolfON |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 604 Регистрация: 19.7.2004 Репутация: 6 Всего: 8 |
Хрипа, представь сколько будет занимать памяти такая строка и сколько лет будет работать с ней регексп, а потом эксплод, если там 15000*(длина серии+длина номера) символов? )
|
|||
|
||||
rz3rr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 27.11.2005 Репутация: нет Всего: нет |
Всё-таки, мысль, которая пришла ранее (отсортировать по num и seria, последовательно пробегать по записям и сравнивать следующую строку на одинаковость) оказалась на текущий момент самой быстрой - занимает около 3 секунд.
|
|||
|
||||
SelenIT |
|
||||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 32 Всего: 401 |
Требование единственного запроса критично?
Что, если сначала получить все повторяющиеся серии:
(предполагается, что оба поля проиндексированы)? Не окажется ли быстрее, по крайней мере с точки зрения нагрузки на mysql-клиента... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
||||
|
|||||
rz3rr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 27.11.2005 Репутация: нет Всего: нет |
SelenIT, проиндексированы. Обработка производится на стороне mysql-сервера. Это разовая работа ("вычистить" таблицу от поторяющихся записей и поменять значения в связанных полях в других таблицах ). Пользователь к этому доступа иметь не будет. Это что-то администраторской функции. Дальнейшая задача уже будет не допускать ввода повторов (в обработчиках форм). К сожалению, разработка базы данных была произведена до меня. Я ограничен в возможностях модифицировать саму базу данных. А вот код обработки - да сколько угодно.
Ладно, всем спасибо за обсуждение -тема закрыта. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |