как запросить повторяющуюся запись строки в MySQL - PullRequest
1 голос
/ 15 мая 2011

У меня есть программа, которая имеет функцию, чтобы показать, по крайней мере, дублирующую аналогичную строку в записях MySQL по крайней мере 2, у меня есть текущая реализация, которая работает хорошо, НО слишком медленно для записей 300K.

Пример записей таблицы CONTACT:

id (int)| name (string) | phone (string)
-----------------------------------------
1       | mike          | 081239812345678
2       | jhon          | 082222212345678
3       | rudy          | 081237712345678
4       | lucy          | 081237712345123
5       | lily          | 081244412345678

Мне нужно, чтобы запись принадлежала "mike, jhon, rudy and lily", потому что 8 из их последних цифр номера телефона совпадают (дублируются), но запись, принадлежащая Люси, игнорируется (потому что никакие другиезапись имеет аналогичное 8-значное конечное число)

Мой текущий метод заключается в использовании 2 запросов, таких как:

Мой первый запрос:

"select right(phoner, 8) as myRight
    , count(*) as totdup
     from contact
     group by myRight
     having totdup > 1";

из этого запроса я могу получитьзначение «myRight», затем я выполняю второй запрос, чтобы получить подробности:

"select * from contact where phone like '%$myRight'";

Мой вопрос: КАК ускорить процесс, потому что у меня есть записи 300 КБ, и для этого запроса требуется около 20 минут, также яЯ пытаюсь упростить запрос, используя только 1 запрос, но я не знаю, как, я боролся с этой проблемой уже пару дней, ваша помощь будет очень признательна.

Ответы [ 4 ]

1 голос
/ 15 мая 2011

Если вы храните (8) крайних правых символов телефонных номеров в обратном порядке, то
Ваша таблица будет иметь следующие поля:

id (int)| name (string) | phone (string)  | phonerev (string)
----------------------------------------------------
1       | mike          | 081239812345678 | 876543218932180
2       | jhon          | 082222212345678 | 876543212222280
3       | rudy          | 081237712345678 | 876543217732180
4       | lucy          | 081237712345123 | 321543217732180
5       | lily          | 081244412345678 | 876543214442180

Вы можете сделать запрос как:

select right(phone,8) as myRight
from contact c1
inner join contract c2 on (left(c1.phonerev,8) = left(c2.phonerev,8) 
                           and c1.id <> c2.id)
group by left(phonerev,8)

Убедитесь, что вы установили индекс для phonerev

Вы можете объединить запрос, выполнив:

select c1.*
from contact c1
inner join contract c2 on (left(c1.phonerev,8) = left(c2.phonerev,8) 
                           and c1.id <> c2.id)

Это позволит использовать индекс по номеру телефона

Если вы просто сохраните 8 самых правых символов в обратном порядке, запрос будет выглядеть следующим образом:

select right(phone,8) as myRight
from contact c1
inner join contract c2 on (c1.phonerev,8 = c2.phonerev 
                           and c1.id <> c2.id)
group by phonerev;

Что еще быстрее.

0 голосов
/ 16 мая 2011

@ Йохан, вы дали мне хорошее направление для ускорения запроса, я добавил новое поле для крайних правых 8 символов телефона, чтобы в запросе не использовалось слово right (phone, 8).

@ Will A, спасибо за вашу помощь, но запрос на самом деле медленнее, чем мое текущее решение, я не знаю почему.

@ LHMathies, ваша идея хороша, но создание временной таблицы для хранения myRight неприменимо для моегосостояние сервера / базы данных.

Спасибо, ребята ~

0 голосов
/ 15 мая 2011

В зависимости от того, какую версию MySQL вы используете, это может работать:

select *
from contact
where RIGHT(phone, 8) IN (
 select right(phone, 8) as myRight
     from contact
     group by myRight
     having COUNT(*) > 1
)
0 голосов
/ 15 мая 2011

Похоже, что вы выполняете цикл над строками результатов первого запроса и выполняете второй запрос один раз для каждой такой строки.

Я бы предложил поместить первый результат во временную таблицу изатем выполните

SELECT contact.* FROM contact JOIN temporary
 WHERE right(contact.phoner, 8) = temporary.myRight

Размещение индекса для временной таблицы, вероятно, повысит вашу производительность еще больше.

...