powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Условие для запроса
8 сообщений из 8, страница 1 из 1
Условие для запроса
    #38957802
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток, не получается придумать правильно условие для запроса:
Есть запрос для биллинговой системы asterisk:
Код: 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,58р.
ФСС (Москва, МО) 1,69р.
ФСС (Москва, МО) Билайн 1,28р.
ФСС (СПб, Ленинградская область) 2,17р.
ФСС (СПб, Ленинградская область) Билайн 1,91р.
ФСС (Остальные регионы) 2,17р.

Запрос успешно считает регионы:
Москва 0,58р.
ФСС (Москва, МО) 1,69р.
ФСС (СПб, Ленинградская область) 2,17р.

Никак не могу придумать условие вида: если провайдер = билайн и регион = москва использовать следующую тарифную зону = 5
вопрос:
Как сделать оптимальней:
1. Делать Дополнительный подзапрос?
2. Добавить дополнительные поля в структуру бд?
3. еще что нибудь?
...
Рейтинг: 0 / 0
Условие для запроса
    #38957829
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитри4Никак не могу придумать условие вида: если провайдер = билайн и регион = москва использовать следующую тарифную зону = 5
У тебя должна быть таблица (провайдер-регион-зона).
...
Рейтинг: 0 / 0
Условие для запроса
    #38957837
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, это единственный вариант?
...
Рейтинг: 0 / 0
Условие для запроса
    #38957873
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не единственный. Но достаточно простой, логичный и понятный, чтобы городить квадратноколёсные велосипеды.
...
Рейтинг: 0 / 0
Условие для запроса
    #38958593
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaДмитри4Никак не могу придумать условие вида: если провайдер = билайн и регион = москва использовать следующую тарифную зону = 5
У тебя должна быть таблица (провайдер-регион-зона).
Переделал:
Код: 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-01 00:00:00'
AND  '2015-05-31 23:59:59'
AND LENGTH( h.src ) <=3
AND LENGTH( h.dst ) >3 AND h.disposition='ANSWERED') as b 
inner join astcdr.`codes`  c on prefix=c.abcdef
inner join astcdr.`zoneinfo` zi on zi.uid=c.zoneinfouid
inner join astcdr.`zone` z on z.uid=zi.zoneuid
inner join astcdr.`isp` i on i.uid=zi.ispuid
inner join astcdr.`numtype` t on t.uid=c.type
inner join astcdr.`region` r on r.uid=zi.regionuid
inner join astcdr.`subregion` s on s.uid=zi.subregionuid
WHERE number between `c`.`start` and `c`.`end`;



Вот я только понять не могу иногда выполняю запрос : он выполняется 8,737 а иногда 0,000 или 0,001 база MariaDB работает внутри виртуальной машины.
Анализ показывает следующее:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+------+-------------+-------+--------+------------------+------------------+---------+------------------------+------+-------------------------------------------------+
| id   | select_type | table | type   | possible_keys    | key              | key_len | ref                    | rows | Extra                                           |
+------+-------------+-------+--------+------------------+------------------+---------+------------------------+------+-------------------------------------------------+
|    1 | SIMPLE      | t     | ALL    | PRIMARY          | NULL             | NULL    | NULL                   |    1 |                                                 |
|    1 | SIMPLE      | h     | ALL    | calldate,bill    | NULL             | NULL    | NULL                   | 4568 | Using where; Using join buffer (flat, BNL join) |
|    1 | SIMPLE      | c     | ref    | abcdef+start+end | abcdef+start+end | 2       | func                   | 1072 | Using index condition; Using where              |
|    1 | SIMPLE      | zi    | eq_ref | PRIMARY,uid      | PRIMARY          | 4       | astcdr.c.zoneinfouid   |    1 |                                                 |
|    1 | SIMPLE      | s     | eq_ref | PRIMARY,uid      | PRIMARY          | 4       | astcdr.zi.subregionuid |    1 |                                                 |
|    1 | SIMPLE      | i     | eq_ref | PRIMARY,uid      | PRIMARY          | 4       | astcdr.zi.ispuid       |    1 |                                                 |
|    1 | SIMPLE      | r     | eq_ref | PRIMARY          | PRIMARY          | 4       | astcdr.zi.regionuid    |    1 |                                                 |
|    1 | SIMPLE      | z     | ALL    | PRIMARY          | NULL             | NULL    | NULL                   |    2 | Using where; Using join buffer (flat, BNL join) |
+------+-------------+-------+--------+------------------+------------------+---------+------------------------+------+-------------------------------------------------+


В чем может быть проблема?
...
Рейтинг: 0 / 0
Условие для запроса
    #38958597
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитри4Переделал:и оно таки работает? вот прямо в таком виде, как вы привели?
...
Рейтинг: 0 / 0
Условие для запроса
    #38958617
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirДмитри4Переделал:и оно таки работает? вот прямо в таком виде, как вы привели?
да работает
...
Рейтинг: 0 / 0
Условие для запроса
    #38958773
Дмитри4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл, добавить что в момент выполнения запроса загрузка CPU на виртуальной машине занимает 100% и потом падает...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Условие для запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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