powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сравнение номеров телефона
41 сообщений из 41, показаны все 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
Сравнение номеров телефона
    #39705587
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извините, нашла ошибку
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705588
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, низкий Вам поклон! Помогли, спасибо огромное!
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 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.dst FROM 3) ELSE cpmt.dst END)=upt.phone
    )x
 GROUP BY id
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705592
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11вот следующая лапшаРусским вроде по белому пишу: алиас КАЖДОМУ полю... и что мы видим? все поля, кроме тех, что в секции ON - голенькие...

Кстати, весьма странно, что запрос в таком виде вообще выполняется, хотя по уму сервер должен был бы нецензурно высказаться в смысле Error 1052 Column '%s' in %s is ambiguous...
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39705598
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaи что мы видим? все поля, кроме тех, что в секции ON - голенькие...

Кстати, весьма странно, что запрос в таком виде вообще выполняется, хотя по уму сервер должен был бы нецензурно высказаться в смысле Error 1052 Column '%s' in %s is ambiguous... простите, не ошиблась и не тот код вставила, сейчас всё работает абсолютно верно!
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39714422
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,уважаемые специалисты! в продолжении начатой темы, есть ли еще какие-нибудь ещё решения для учета номеров среди которых есть те, к которым добавлены слева цифры 89?
конструкция предложенная ранее:
Код: plsql
1.
2.
3.
4.
Select GROUP_CONCAT(p.number)
FROM phones p LEFT JOIN cdr AS c
ON (CASE WHEN c.dst LIKE '8938%'
     THEN SUBSTRING(c.dst FROM 3) ELSE c.dst END)=p.number


выполняется, но не работает, то есть не учитывает номера начинающиеся с 89...
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39714431
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11,

Предложенный ранее вариант с вычитанием категорически не подходит?
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39714447
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11не учитываетЗапрос ничего не учитывает - это не нормировщик на заводе... Запрос возвращает набор записей в соответствии с заложенной в его текст логикой отбора.
Выражайтесь яснее...
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39714504
hatter11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina Запрос возвращает набор записей в соответствии с заложенной в его текст логикой отбора.
Выражайтесь яснее...Буду стараться, спасибо.
Опять я создала ложную тревогу, запрос с вашей,Akina, помощью возвращает то что надо...была база не обновлена из-за этого был неожиданный результат
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39714615
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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%'
но сомневаюсь, что это правильно, поэтому прошу подправить меня

телефоны в БД хранятся в 3х полях:
cn int -- код страны
code smallint
num int

индекс только по num, поиск по num + code + cn
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39714704
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухтелефоны в БД хранятся в 3х полях:Зависит от задачи.
Задача ТС не кажется мне той задачей, где это актуально.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39714724
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что "это"?
обычный удобный способ хранения телефонов
и на задачу ещё раз посмотри, повнимательней
авторможет начинаться цифрами 8938 или 38
авторAND phone like '8938%'=phone like'38%'
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39715223
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухчто "это"?
обычный удобный способ хранения телефонов
и на задачу ещё раз посмотри, повнимательней
авторможет начинаться цифрами 8938 или 38
авторAND phone like '8938%'=phone like'38%'При таком раскладе начальные цифры 89 не относятся ни к одному из этих полей.
Если их сохранять, то в какое поле?
Если их очищать при записи, то единое поле все равно удобнее.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39715265
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЕсли их сохранять, то в какое поле?
cn
как это не относятся, если это код страны?
Если их очищать при записи
если юзер шлёт с формы страну, зачем их очищать?
у нас конкретная ситуация - телефоны со странами, к чему эти фантазии?
единое поле все равно удобнее.
в едином поле будет сначала код, потом номер и это индекс на 10 цифр, вместо 7.
Поиск по code вернёт 10000+ num, в которых снова искать, а поиск по num всего 1-2 code.
в каком месте тут "удобнее"?
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39715278
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухкак это не относятся, если это код страны?Нет, это префикс выхода на городскую линию офисной АТС, частью номера не является.
И такого кода страны не существует.
А вот следующие цифры 381 - код Сербии.
полудухв едином поле будет сначала код, потом номер и это индекс на 10 цифр, вместо 7.Это индекс на одно поле, а не на три.
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39715582
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftполудухкак это не относятся, если это код страны?Нет, это префикс выхода на городскую линию офисной АТС, частью номера не является.
И такого кода страны не существует.
А вот следующие цифры 381 - код Сербии.
полудухв едином поле будет сначала код, потом номер и это индекс на 10 цифр, вместо 7.Это индекс на одно поле, а не на три.
префикс никто не пишет в БД
речь про КОД СТРАНЫ.

где ты там 3 индекса увидел?
полудух индекс только по num , поиск по num + code + cn
...
Рейтинг: 0 / 0
Сравнение номеров телефона
    #39717391
Набрызг-Бетон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hatter11Добрый день,уважаемые специалисты! в продолжении начатой темы, есть ли еще какие-нибудь ещё решения для учета номеров среди которых есть те, к которым добавлены слева цифры 89?
..
ну например приказ минсвязи регламентирующий передачу этих самых номеров. который не всегда исполняется.

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


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