powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Составление запроса к двум базам
11 сообщений из 11, страница 1 из 1
Составление запроса к двум базам
    #38953336
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток, делаю биллинговую систему для сервера телефонии Asterisk.
у сервера есть своя база данных с историей вызовов asteriskcdrdb и таблица cdr вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE IF NOT EXISTS `cdr` (
  `calldate` datetime NOT NULL default '0000-00-00 00:00:00',
  `clid` varchar(80) character set latin1 NOT NULL default '',
  `src` varchar(80) character set latin1 NOT NULL default '',
  `dst` varchar(80) character set latin1 NOT NULL default '',
  `dcontext` varchar(80) character set latin1 NOT NULL default '',
  `channel` varchar(80) character set latin1 NOT NULL default '',
  `dstchannel` varchar(80) character set latin1 NOT NULL default '',
  `lastapp` varchar(80) character set latin1 NOT NULL default '',
  `lastdata` varchar(80) character set latin1 NOT NULL default '',
  `duration` int(11) NOT NULL default '0',
  `billsec` int(11) NOT NULL default '0',
  `disposition` varchar(45) character set latin1 NOT NULL default '',
  `amaflags` int(11) NOT NULL default '0',
  `accountcode` varchar(20) character set latin1 NOT NULL default '',
  `uniqueid` varchar(32) character set latin1 NOT NULL default '',
  `userfield` varchar(255) character set latin1 NOT NULL default '',
  `did` varchar(50) character set latin1 NOT NULL default '',
  `recordingfile` varchar(255) character set latin1 NOT NULL default '',
  KEY `calldate` (`calldate`),
  KEY `dst` (`dst`),
  KEY `accountcode` (`accountcode`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Номера в поле dst могут быть вида:
981112223344,81112223344


Также есть моя база данных к которой уже составлен запрос с помощью которого я получаю регион номера , зону тарифа , стоимость и т.д.
Запрос вида:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT r.regionname,s.subregionname,i.ispname,z.price FROM `codes` a 
inner join `region` r on r.uid=a.regionuid 
inner join `isp` i on i.uid=a.ispuid
inner join `subregion` s on s.uid=a.subregionuid
inner join `zone` z on z.uid=r.zoneuid
WHERE '6607100' between `start` and `end` and `abcdef`='495' ORDER BY `start` DESC LIMIT 1



Вопрос :
Как можно сделать запрос сразу к двум базам чтобы результаты из первой базы подставить в запрос к моей и добавить например необходимые фильтры по дате исходящему номеру и т.д.
...
Рейтинг: 0 / 0
Составление запроса к двум базам
    #38953346
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитри4Как можно сделать запрос сразу к двум базам 17599693 и далее.
...
Рейтинг: 0 / 0
Составление запроса к двум базам
    #38953371
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я наверное неправильно сформулировал вопрос
Надо из базы сервера поля dst получить номер и разбить его на 2 переменные чтобы можно было подставить в другой запрос...
Например в поле dst имеем номер 981112223344 или 81112223344
Надо получить две переменные prefix и num где prefix=111 , num=2223344
...
Рейтинг: 0 / 0
Составление запроса к двум базам
    #38953422
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Num = Right(dst, 7)
Prefix = Left(dst, Length(dst)-7)
...
Рейтинг: 0 / 0
Составление запроса к двум базам
    #38953435
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока ждал, сделал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT src, SUBSTRING( RIGHT( LPAD( dst, 12,  '9' ) , 10 ) , 3, 7 ) AS number, SUBSTRING( RIGHT( LPAD( dst, 12,  '9' ) , 10 ) , 1, 3 ) AS prefix
FROM  `cdr` 
WHERE  `calldate` 
BETWEEN  '2015-05-06 00:00:00'
AND  '2015-05-06 23:59:00'
AND src =113
AND LENGTH( dst ) >3
LIMIT 0 , 30


осталось прикрутить к другому запросу
...
Рейтинг: 0 / 0
Составление запроса к двум базам
    #38953568
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смог сделать только так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT h.calldate,h.src, SUBSTRING( RIGHT( LPAD( h.dst, 12,  '9' ) , 10 ) ,1, 10 ) as dst, r.regionname,s.subregionname,i.ispname,z.price FROM `astcdr`.`codes` as bill 
inner join `region` r on r.uid=bill.regionuid 
inner join `isp` i on i.uid=bill.ispuid
inner join `subregion` s on s.uid=bill.subregionuid
inner join `zone` z on z.uid=r.zoneuid
inner join `asteriskcdrdb`.`cdr` h on h.uniqueid!=bill.uid
WHERE SUBSTRING( RIGHT( LPAD( h.dst, 12,  '9' ) , 10 ) , 3, 7 ) between `bill`.`start` and `bill`.`end` 
and `bill`.`abcdef`=SUBSTRING( RIGHT( LPAD( h.dst, 12,  '9' ) , 10 ) , 1, 3 ) 
AND LENGTH( h.dst ) >3 and h.src=113
and `calldate` BETWEEN  '2015-05-07 00:00:00' AND  '2015-05-07 23:59:00' 
ORDER BY `bill`.`start`


просьба специалистов посмотреть можно ли как нибудь оптимизировать запрос
...
Рейтинг: 0 / 0
Составление запроса к двум базам
    #38953624
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитри4,

1-й момент: У вас дополнение номера до 12 цифр и отрезка значащих правых 10-и штук в запросе указана дважды. Если оптимизатор сработает, то можно так и оставить. Но:

2-й момент: Формирование полного dst (момент№1) идет из базы астериска, а ограничение выборки - условия наложены из обоих баз...

Я бы вынес фильтрацию и формирование всех подстрок в подзапрос, максимально ограниченный условиями по базе астериска и уже потом, пришивал его к вашей базе, поскольку база астериска, как правило, велика есть...

Ну и думаю, вполне достаточно посмотреть план и недостающие индексы. :)
...
Рейтинг: 0 / 0
Составление запроса к двум базам
    #38957767
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109Дмитри4,

1-й момент: У вас дополнение номера до 12 цифр и отрезка значащих правых 10-и штук в запросе указана дважды. Если оптимизатор сработает, то можно так и оставить. Но:

2-й момент: Формирование полного dst (момент№1) идет из базы астериска, а ограничение выборки - условия наложены из обоих баз...

Я бы вынес фильтрацию и формирование всех подстрок в подзапрос, максимально ограниченный условиями по базе астериска и уже потом, пришивал его к вашей базе, поскольку база астериска, как правило, велика есть...

Ну и думаю, вполне достаточно посмотреть план и недостающие индексы. :)

Согласен с вами, переделал в такой вид:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT src, prefix, number, billsec, z.price ,ROUND(ROUND(billsec/60, 2)*z.price, 2) as bill, t.numbertype, i.ispname,s.subregionname,r.regionname
FROM(
SELECT h.src,  SUBSTRING( RIGHT( LPAD( h.dst, 12,  '9' ) , 10 ) , 1, 3 ) AS prefix ,SUBSTRING( RIGHT( LPAD( h.dst, 12,  '9' ) , 10 ) , 3, 7 ) AS number, h.billsec
FROM  `asteriskcdrdb`.`cdr` h
WHERE  `calldate` 
BETWEEN  '2015-05-06 00:00:00'
AND  '2015-05-12 23:59:00'
AND h.disposition='ANSWERED'
AND LENGTH( h.src ) <=3
AND LENGTH( h.dst ) >3) as b 
inner join astcdr.`codes`  c on prefix=c.abcdef
inner join astcdr.`isp` i on i.uid=c.ispuid
inner join astcdr.`numtype` t on t.uid=c.type
inner join astcdr.`region` r on r.uid=c.regionuid and r.regiontype=t.uid
inner join astcdr.`subregion` s on s.uid=c.subregionuid
inner join astcdr.`zone` z on z.uid=r.zoneuid
WHERE number between `c`.`start` and `c`.`end`
...
Рейтинг: 0 / 0
Составление запроса к двум базам
    #38957772
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитри4,

AND '2015-05-12 23:59:59'
:)
...
Рейтинг: 0 / 0
Составление запроса к двум базам
    #38957804
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-k2-Дмитри4,

AND '2015-05-12 23:59:59'
:)
Что-то не так ?
...
Рейтинг: 0 / 0
Составление запроса к двум базам
    #38957825
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитри4-k2-Дмитри4,

AND '2015-05-12 23:59:59'
:)
Что-то не так ?59 секунд забыли.
А что если нужная запись попадет в последнюю минуту суток?

Я таки вещи вообще пишу так:
Код: sql
1.
WHERE `calldate` >= '2015-05-06 00:00:00' AND  `calldate` < '2015-05-13 00:00:00'
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Составление запроса к двум базам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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