Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск повторяющихся строк в многомерном массиве 
V
    Опции темы
rz3rr
Дата 11.5.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 27.11.2005

Репутация: нет
Всего: нет



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



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

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

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

PM MAIL ICQ   Вверх
rz3rr
Дата 11.5.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 27.11.2005

Репутация: нет
Всего: нет



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

Добавлено через 4 минуты и 6 секунд
WolfON, ваш вариант так же не прокатывает - вылетает по таймауту. Мысль в голову пришла - отсортировать по num и seria, последовательно пробегать по записям и сравнивать следующую строку на одинаковость (кроме indx естесссно).
PM MAIL   Вверх
mishaSL
Дата 11.5.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



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


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
WolfON
Дата 11.5.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



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

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

Хотя я все-таки настаиваю на решении этой задачи с помощью SQL.
PM MAIL ICQ   Вверх
rz3rr
Дата 12.5.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 27.11.2005

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
Хрипа
Дата 12.5.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: -6
Всего: нет



Это элементарно
Сохраняишь массив в одну строку
типа $d .="\".$array[$i];
при помоши регов ишеш совпадения фразы 
Потом бьёш строку Explode 
И выводишь в цикле всё пользывателю в таблицу..
Надеюсь автоматически генирируймую таблицу сможешь сделать.
-*-----
Что бы быстрей работало сделай функцией
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
WolfON
Дата 12.5.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



Хрипа, представь сколько будет занимать памяти такая строка и сколько лет будет работать с ней регексп, а потом эксплод, если там 15000*(длина серии+длина номера) символов? )
PM MAIL ICQ   Вверх
rz3rr
Дата 12.5.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 27.11.2005

Репутация: нет
Всего: нет



Всё-таки, мысль, которая пришла ранее (отсортировать по num и seria, последовательно пробегать по записям и сравнивать следующую строку на одинаковость) оказалась на текущий момент самой быстрой - занимает около 3 секунд.
PM MAIL   Вверх
SelenIT
Дата 12.5.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



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

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-клиента...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
rz3rr
Дата 13.5.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 27.11.2005

Репутация: нет
Всего: нет



SelenIT, проиндексированы. Обработка производится на стороне mysql-сервера. Это разовая работа ("вычистить" таблицу от поторяющихся записей и поменять значения в связанных полях в других таблицах ). Пользователь к этому доступа иметь не будет. Это что-то администраторской функции. Дальнейшая задача уже будет не допускать ввода повторов (в обработчиках форм). К сожалению, разработка базы данных была произведена до меня. Я ограничен в возможностях модифицировать саму базу данных. А вот код обработки - да сколько угодно.
Ладно, всем спасибо за обсуждение -тема закрыта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1303 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.