powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / select
5 сообщений из 5, страница 1 из 1
select
    #32272740
Lancee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли средствами mysql (без програмных средств)
сделать выборку по максимальному кол-ву совпадающих цифр за один запрос?
Типа:
area areaname
380 Ukraine
38044 Ukraine Kiev
380542 Ukraine Sumy
...

Есть у меня номер 380442226577
Как сделать select по максимальному совпадению в первой колонке (area), чтобы определить назначение звонка?
Сейчас у меня это реализовано програмными средствами, но много запросов получается, что грузит sql сервер. Хочется оптимизировать.
...
Рейтинг: 0 / 0
select
    #32272923
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ты точно можешь сказать сколько символов сравнивать, то делай через LEFT JOIN или временную таблицу.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
use test;

create table tel_code (area varchar( 100 ), areaname varchar( 255 ));

insert into tel_code values ('380', 'Ukraine');
insert into tel_code values ('38044', 'Ukraine Kiev');
insert into tel_code values ('380542', 'Ukraine Sumy');

select * from tel_code;
+ --------+--------------+
 
| area   | areaname     |
+ --------+--------------+
 
|  380     | Ukraine      |
|  38044   | Ukraine Kiev |
|  380542  | Ukraine Sumy |
+ --------+--------------+
 
 3  rows in set ( 0 . 02  sec)

set @ph_no:='380442226577';

select @ph_no;
+ --------------+
 
| @ph_no       |
+ --------------+
 
|  380442226577  |
+ --------------+
 
 1  row in set ( 0 . 00  sec)

select @ph_no, a.*,
(
  (left(@ph_no,  1 )=a.area)* 1 +
  (left(@ph_no,  2 )=a.area)* 2 +
  (left(@ph_no,  3 )=a.area)* 3 +
  (left(@ph_no,  4 )=a.area)* 4 +
  (left(@ph_no,  5 )=a.area)* 5 +
  (left(@ph_no,  6 )=a.area)* 6 +
  (left(@ph_no,  7 )=a.area)* 7 +
  (left(@ph_no,  8 )=a.area)* 8 +
) c from tel_code a order by 
(
  (left(@ph_no,  1 )=a.area)* 1 +
  (left(@ph_no,  2 )=a.area)* 2 +
  (left(@ph_no,  3 )=a.area)* 3 +
  (left(@ph_no,  4 )=a.area)* 4 +
  (left(@ph_no,  5 )=a.area)* 5 +
  (left(@ph_no,  6 )=a.area)* 6 +
  (left(@ph_no,  7 )=a.area)* 7 +
  (left(@ph_no,  8 )=a.area)* 8 +
) desc limit  1 ;
+ --------------+-------+--------------+------+
 
| @ph_no       | area  | areaname     | c    |
+ --------------+-------+--------------+------+
 
|  380442226577  |  38044  | Ukraine Kiev |     5  |
+ --------------+-------+--------------+------+
 
 1  row in set ( 0 . 00  sec)

mahoune
...
Рейтинг: 0 / 0
select
    #32273360
Lancee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Супер! Работает!
Только самого процесса я не понял.
Поясни, плз, если затруднит. Бо доки что-то не помогают понять эту конструкцию.
...
Рейтинг: 0 / 0
select
    #32273417
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(left(@ph_no, N)=a.area)*N
эта констркци означает:
если N символ в номере телефона равен коду в поле то возвращает 1 иначе 0
left(@ph_no, N)=a.area
Умножаем на N - получаем вес совпадения.

То же для остального кол-ва символов слева от 1 до 8. Соответственно если все 8 цифр совпадут - самый тяжелый вес. Попали в точку!
Склаlsdfnm для каждого кол-ва символов надо, т.к. не знаем сколько цифр совпадет. Грубо говоря может совпасть только определенное кол-во символов, это из-за использования =
Если делать так:
(a.area LIKE CONCAT(left(@ph_no, N),'%'))*N*10
То можно было-бы высчитывать приближенные вхождения! 10 здесь надо по столько постольку совпадение 2 символов должно "весить" больше 1 а совпадение 3 больше 2 и 1 и т.д.

ORDER BY сортирует по этому весу.
DESC в порядке убывания.
LIMIT 1 - выдать только одну запись (в нашем случае самую "тяжелую").
...
Рейтинг: 0 / 0
select
    #32274915
Фотография alienzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 mahoune
Это было круто !
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / select
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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