SQL связь таблиц по телефону

185
23 мая 2018, 14:50

Задача такая: Есть таблица клиентов CUSTOMERS с телефонами вида

customer_id | name | phone ...

Есть таблица CALLS звонков клиентам, приходящая от ip телефонии вида

call_id | call_from | call_to | time ...

Проблема в том, что номера телефонов хранятся в произвольном формате. Т.е. клиенты иногда указывают код страны/города, иногда нет, иногда нули впереди, иногда плюсики, дефисы в середине, скобки и т.д. От ip телефонии тоже иногда звонки записываются с нулями впереди и не понятно какая страна, иногда полноценно с кодом страны, иногда проскакивает "+" перед номером. Одно хорошо - в таблице звонков нет лишних символов в середине номера.

Собственно нужно связать эти таблицы чтобы видеть звонки клиентов.

Пока решил проблему так: вырезаю регуляркой на РНР "не цифры", потом начинаю искать по части номера (WHERE call_from LIKE '%phone' OR call_to LIKE '%phone'), если не нашлось отрезаю переднюю цифру и еще раз ищу и т.д. пока не найдет звонок или цифр не станет меньше 7.

Работает. Но:

  1. Очень ресурсоъемко.
  2. Я не представляю как при этом вывести например "всех у кого за последние 2 недели было более 2х звонков" и другие запросы, когда требуется поиск не по одному телефону одного клиента а по всей базе. Хотелось бы чуда в виде INNER JOIN :)

Спасибо.

Answer 1

На мой взгляд можно решить проблему добавив в таблицы ещё одно поле с телефоном, в которое будет записываться преобразованный телефон. Например, последние 7 цифр. Это можно сделать как программно, так и с помощью триггера на вставку/обновление. По такому полю уже можно легко делать полноценный JOIN. По сути это повторит Ваши действия, только подготовленная информацию уже сразу будет лежать в базе.

READ ALSO
поиск подстроки в mysql

поиск подстроки в mysql

можно ли в столбце из строки: 10,13,18/12:00:00/15:55:00 извлечь первые 3 цифры до символа '/' ? то есть мне надо что бы оператор LIKE сравнивал только (10,13,18),...

192
Todo list на php [закрыт]

Todo list на php [закрыт]

Подскажите, можно ли сделать простой Todo list без использования БД?

198
Как определить первую запись в цикле foreach

Как определить первую запись в цикле foreach

есть массив, после прохождения по массиву циклом foreach нужно определить первую запись к примеру:

199
Symfony 2.3.6 - smtp не отправляет письма, если не задан delivery_address

Symfony 2.3.6 - smtp не отправляет письма, если не задан delivery_address

Несколько дней назад smtp через Яндекс перестал работатьПробовал почистить кеш, но это не помогло

201