powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сравнение номеров телефона
25 сообщений из 41, страница 1 из 2
Сравнение номеров телефона
    #39705247
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, есть такой запрос
Код: plsql
1.
SELECT id,phone,disposition,AcctId FROM users_phones_temp upt JOIN calls_per_month_temp cpmt ON upt.phone=cpmt.dst


мне необходимо к этому запросу добавить условие, что один и тот же номер(phone) может начинаться цифрами 8938 или 38, например: 89381000000000 или 381000000000 -это тот же самый номер.
Подскажите пожалуйста как это сделать. Я сейчас не могу проверить в программе, поэтому придумала вот что:
AND phone like '8938%'=phone like'38%'
но сомневаюсь, что это правильно, поэтому прошу подправить меня
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705252
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11Подскажите пожалуйста как это сделать.Хранить номера телефонов в едином международном формате.
Например, в случае российских кодов, приводить '8-495-123-45-67' к '74951234567'.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705255
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если в базе в таком виде как я привела, разве ничего нельзя придумать?
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705256
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или вот так
Код: plsql
1.
AND Phone like '38%' in (phone like '8938%'
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705258
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11придумала вот что:
Код: sql
1.
AND phone like '8938%'=phone like'38%'

Гарантированный False вне зависимости от значения.

hatter11необходимо к этому запросу добавить условие, что один и тот же номер(phone) может начинаться цифрами 8938 или 38
Код: sql
1.
2.
3.
4.
CASE WHEN phone LIKE '8938%' 
     THEN SUBSTRING(phone FROM 3)
     ELSE phone
END
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705261
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinahatter11придумала вот что:
Код: sql
1.
AND phone like '8938%'=phone like'38%'

Гарантированный False вне зависимости от значения.

hatter11необходимо к этому запросу добавить условие, что один и тот же номер(phone) может начинаться цифрами 8938 или 38
Код: sql
1.
2.
3.
4.
CASE WHEN phone LIKE '8938%' 
     THEN SUBSTRING(phone FROM 3)
     ELSE phone
END


Спасибо Akina, попробую!
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705281
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11а если в базе в таком виде как я привела, разве ничего нельзя придумать?Связь таблиц по полям с преобразованием строк всяко тормознее получится, чем связь по числовым полям с нормализованными данными. В этом смысле сделать можно, конечно, но насколько хорошо оно будет работать с таблицами в десять тысяч, сто тысяч или в миллион строк - это вопрос. На тестовых сотне строк, конечно, не заметите проблем.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705401
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
к сожалению работает только на поиск номеров 381000000000, а нужно чтобы попадали номерами начинающимися с 89 то есть такой же номер только впереди с двумя цифрами 89 381000000000
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705406
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11работает только на поиск номеров 381000000000, а нужно чтобы попадали номерами начинающимися с 89 то есть такой же номер только впереди с двумя цифрами 89 381000000000Неправильно используете, значит.

Показывайте текст запроса. И не забудьте объяснить, что же он делает.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705428
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinahatter11работает только на поиск номеров 381000000000, а нужно чтобы попадали номерами начинающимися с 89 то есть такой же номер только впереди с двумя цифрами 89 381000000000Неправильно используете, значит.

Показывайте текст запроса. И не забудьте объяснить, что же он делает.
весь запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  SELECT id,
  SUM(CASE WHEN disposition ="ANSWERED" THEN 1 ELSE 0 END) as "отвеченных",
  SUM(CASE when disposition ="NO ANSWER" THEN 1 ELSE 0 END) AS "нет ответа",
  SUM(CASE WHEN disposition ="FAILED" THEN 1 ELSE 0 END) AS "сбой",
  SUM(CASE WHEN disposition ="BUSY" THEN 1 ELSE 0 END) AS "занят", phone
  FROM( 

 SELECT id,phone,disposition,AcctId FROM users_phones_temp upt JOIN calls_per_month_temp cpmt ON upt.phone=cpmt.dst
  AND CASE WHEN phone LIKE '8938%' 
     THEN SUBSTRING(phone FROM 3)
     ELSE phone
END)x
GROUP BY id


есть две таблицы users_phones_temp upt, где находятся id пользователя и его phone(в этой таблице номера не повторяются и все они в формате 381000000000) и таблица calls_per_month_temp cpmt, в которой в столбце dst находятся номера телефонов в 2-х форматах: 381000000000 и 89 381000000000 и могущие повторятся, также в этой таблице есть поле disposition содержащее значения ANSWERED...
В запросе я должна посчитать количество звонков по каждому юзеру(id из первой таблицы); звонки могут быть отвеченные/не отвеч/сбой/занят - и для каждого варианта считаю количество звонков. Связь с двумя таблицами у меня происходит по phone, но так как один и тот же номер во второй таблице может принимать 2 варианта, то на данный момент считаются номера только в формате 381000000000.
Как-то надо придумать чтобы сравнивались оба варианта из второй таблицы с номером телефона из первой таблице, где номера только в одном формате 381000000000.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705430
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
должно быть 3 столба:
cn 7
code 123
num 4567890
и индекс по num
а вот это всё - сжечь.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705432
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас результат такой:
Код: plsql
1.
2.
3.
4.
187701	194	105	6	10	380983000000
187719	87	63	3	10	380500000000
187795	399	214	12	27	380974000000
187799	0	0	1	0	38095493877
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705485
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11может начинаться цифрами 8938 или 38, например: 89381000000000 или 381000000000 -это тот же самый номер.
89381000000000 — это не номер.
Номер это 381000000000.
8 — это выход на междугороднюю линию.
9 — это выход на международнюю линию.
Все эти выходы никакого отношения к номеру не имеют, да и они могут отличаться.
Поэтому, как сказали в первом же ответе, все телефонные номера нужно хранить в международном формате.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705487
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11в 2-х форматах: 381000000000 и 89 381000000000
hatter11Как-то надо придумать чтобы сравнивались оба варианта из второй таблицы с номером телефона из первой таблице, где номера только в одном формате 381000000000.Самое правильное - добавить столбец с нормализованными данными.

Костыльные варианты:
- Брать последние 12 символов ненормализованных данных и сравнивать по ним. Ну тут по ситуации, конечно, если только все номера содержат именно 12 знаков.
- Перед сравнением вычесть из номера 89000000000000, если он больше этого значения.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705490
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.hatter11может начинаться цифрами 8938 или 38, например: 89381000000000 или 381000000000 -это тот же самый номер.
89381000000000 — это не номер.
Номер это 381000000000.
8 — это выход на междугороднюю линию.
9 — это выход на международнюю линию.
Все эти выходы никакого отношения к номеру не имеют, да и они могут отличаться.
Поэтому, как сказали в первом же ответе, все телефонные номера нужно хранить в международном формате.
это не выход на международную линию..... система учета звонков помечает таким образом повторно набранные звонки
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705492
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухcn 7
code 123
num 4567890
и индекс по num

Неверно, индекс должен быть по полному номеру.
Поэтому смысла хранить номер в трех полях нет.
Более того, номера телефонов лучше хранить как числа, так как требуемая числовая точность (11 разрядов) в MySQL вполне доступна, а кода страны, начинающегося с нуля, не существует.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705494
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11это не выход на международную линию..... система учета звонков помечает таким образом повторно набранные звонки
Это вообще не важно.
Суть в том, что все эти префиксы не относятся непосредственно к телефонному номеру и хранить их не нужно.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705499
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.hatter11это не выход на международную линию..... система учета звонков помечает таким образом повторно набранные звонки
Это вообще не важно.
Суть в том, что все эти префиксы не относятся непосредственно к телефонному номеру и хранить их не нужно.
может и не нужно, но я не админ БД, только неделю работаю с базой, у меня задача узнать какое количество раз был набран каждый телефон, поэтому номера с префиксом имеют значение для решения задачи. Как-то же можно придумать, что можно сделать для поиска с учетом этого префикса.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705501
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если эти префиксы и пометки что-то значат, то их нужно хранить в БД, но отдельно от номера (в отдельном столбце).
Сам номер должен быть очищен от мусора. А если его хранить как число, то это сократит занимаемый объем и может ускорить выборки.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705512
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11весь запросЭто лапша, а не запрос. Если в источнике данных более одной таблицы (даже если это две копии одной таблицы) - следует указывать алиас таблицы для КАЖДОГО поля. Иначе получится не запрос, а вот такая нечитаемая хрень.

hatter11
Код: sql
1.
2.
3.
4.
5.
ON upt.phone=cpmt.dst
  AND CASE WHEN phone LIKE '8938%' 
     THEN SUBSTRING(phone FROM 3)
     ELSE phone
END


:facepalm: Вы не пробовали думать, прежде чем код писАть???

Каким бы ни было значение поля phone из неуказанной таблицы (кроме нуля и null) - CASE вернёт ненулевое значение, которое будет воспринято как True (если же значение ноль, то наоборот, False, а если Null, то CASE, да и всё выражение связывания, тоже будет null, интерпретируемый как False).

Вместо этого бреда нужно преобразованное оператором CASE значение поля phone неуказанной таблицы приравнять соответствующему значению некоего поля другой таблицы.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705534
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всё равно не получается...
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705546
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторяю.

Первое: AkinaПоказывайте текст запроса
Второе: Akinaалиас таблицы для КАЖДОГО поля
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705548
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, имеется в виду, что и первое, и второе - ОДНОВРЕМЕННО.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705552
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.полудухcn 7
code 123
num 4567890
и индекс по num

Неверно, индекс должен быть по полному номеру.
Поэтому смысла хранить номер в трех полях нет.
Более того, номера телефонов лучше хранить как числа, так как требуемая числовая точность (11 разрядов) в MySQL вполне доступна, а кода страны, начинающегося с нуля, не существует.
после нахождения номера там останется 1-10 строк (1 в 99% случаев)
смысл есть ещё и потому, что cn может иметь 6 цифр
это и есть числа.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705586
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaПовторяю.

Первое: AkinaПоказывайте текст запроса
Второе: Akinaалиас таблицы для КАЖДОГО поля
Вы опять будете ругаться,но, простите меня за бред, я только учусь, вот следующая лапша:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
   SELECT id,
  SUM(CASE WHEN disposition ="ANSWERED" THEN 1 ELSE 0 END) as "отвеченных",
  SUM(CASE when disposition ="NO ANSWER" THEN 1 ELSE 0 END) AS "нет ответа",
  SUM(CASE WHEN disposition ="FAILED" THEN 1 ELSE 0 END) AS "сбой",
  SUM(CASE WHEN disposition ="BUSY" THEN 1 ELSE 0 END) AS "занят", phone
  FROM( 

 SELECT DISTINCT id,phone,disposition,AcctId FROM users_phones_temp upt JOIN calls_per_month_temp cpmt ON (CASE WHEN cpmt.dst LIKE '8938%'
     THEN SUBSTRING(cpmt.phone FROM 3) END)=upt.phone
    )x
 GROUP BY id

 
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сравнение номеров телефона
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]