SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.03.2017 16:25:33

Тарас
Участник
Зарегистрирован: 03.03.2017
Сообщений: 5

Поиск похожих значений

Есть таблица users_pi с информацией о пользователях, в которой есть поле `phone` varchar(40) NOT NULL DEFAULT ''
Нужно найти всех пользователей у которых есть повторяющиеся номера.
Проблема в том что у одного пользователя может быть несколько номеров.

По запросу:

select * from users_pi
where  LENGTH(phone)>9 and (phone) IN (
select phone
from users_pi
group by phone having count(*)>1
)
order by phone


мне выводит только тех, у которых записан один номер и у дубликатов тоже один.

Что делать если у одного пользователя записаны номера '0123456789 0123456798', у другого '0123451111 0123456798'? Так как здесь тоже совпадают 2 номера.

Неактивен

 

#2 03.03.2017 16:31:53

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Поиск похожих значений

1.

group by user_id, phone having count(*)>1

2. Если записано в поле несколько телефонов, то нужно приводить записи к нормальному виду: одна запись - один телефон. Для этого можно использовать функцию SUBSTRING_INDEX.

Отредактированно klow (03.03.2017 16:32:16)

Неактивен

 

#3 03.03.2017 16:45:09

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Поиск похожих значений

А лучше (если есть возможность), то хранить все телефоны в отдельных записях и не пользоваться полумерами. Где-нибудь да выстрелит в ногу.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 03.03.2017 16:47:12

Тарас
Участник
Зарегистрирован: 03.03.2017
Сообщений: 5

Re: Поиск похожих значений

Тоесть если записано 2 номера отделенные пробелом, то использовать

SUBSTRING_INDEX(phone, ' ', 1);
  и 
SUBSTRING_INDEX(phone, ' ', -1);
?
и что делать если записаны 3 номера, как быть с тем, что посередине?

Отредактированно Тарас (03.03.2017 16:50:10)

Неактивен

 

#5 03.03.2017 16:56:49

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Поиск похожих значений

Предлагаю не просто использовать, а поменять такие строки на нормальные. А эти удалить.
Для вычисления произвольного значения нужно использовать SUBSTRING_INDEX(SUBSTRING_INDEX(phone, ' ', index), ' ', -1), где index номер телефона по порядку. Но это будет работать правильно только если используется один пробел. Если есть несколько подряд пробелов, то предварительно их нужно заменить на один.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson