Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Упрощение запроса, Много повторяющегося 
V
    Опции темы
champion
Дата 16.10.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 26.1.2005

Репутация: нет
Всего: 2



Сделал запрос на вывод статистики по звонкам CDR, для системы биллинга сервера IP-Телефонии. Громоздкий он очень.. хотелось бы упростить, можно как-то?
Код

SELECT 
    `calldate`, 
    `clid`, 
    `dst`, 
    (
        SELECT 
            `price`.`code` 
        FROM 
            `price`
        WHERE 
            LOCATE(
                `price`.`code`,
                SUBSTRING(`cdr`.`dst`, 2)
            ) = 1
        ORDER BY 
            `price`.`code` DESC
        LIMIT 0,1
    
    )
    AS `billcode`,
    `billsec`, 
    (FLOOR(`billsec`/60+1)) as `billmins`,
    ((
        SELECT 
            `price`.`price` 
        FROM 
            `price`
        WHERE 
            LOCATE(
                `price`.`code`,
                SUBSTRING(`cdr`.`dst`, 2)
            ) = 1
        ORDER BY 
            `price`.`code` DESC
        LIMIT 0,1
    ) * FLOOR(`billsec`/60+1)) AS `cost`,
    (
        SELECT
            `price`.`title`
        FROM 
            `price`
        WHERE 
            LOCATE(
                `price`.`code`,
                SUBSTRING(`cdr`.`dst`, 2)
            ) = 1
        ORDER BY 
            `price`.`code` DESC
        LIMIT 0,1        
    ) AS `direction`
FROM `cdr`
    WHERE LENGTH(`dst`) > 10 
AND 
    SUBSTRING(`dst`,1,1) LIKE '8' 
AND 
    `billsec` > 0

Также с этим кодом при попытке зайти в созданный для него View ложится MySQl.


--------------------
user posted image
PM MAIL   Вверх
Zloxa
Дата 17.10.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



если price.code - ключ, то както так:
Код

select s.*
       ,price.price * FLOOR(`billsec`/60+1)) AS `cost`
       ,`price`.`title` AS `direction`
from (
  SELECT 
      `calldate`, 
      `clid`, 
      `dst`, 
      `billsec`, 
      (FLOOR(`billsec`/60+1)) as `billmins`,
      (
          SELECT `price`.`code` 
          FROM `price`
          WHERE `price`.`code` like concat(SUBSTRING(`cdr`.`dst`, 2),'%')
          ORDER BY `price`.`code` DESC
          LIMIT 0,1
      ) AS `billcode`
  FROM `cdr`
      WHERE LENGTH(`dst`) > 10 
  AND 
      dst LIKE '8%' 
  AND 
      `billsec` > 0
)  s
left join `price` on `price`.code = s.billcode





--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
champion
Дата 18.10.2010, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 26.1.2005

Репутация: нет
Всего: 2



Zloxa, спасибо! Правда MySQL виснет при запросе.. 3 внутренний select убрал, и сделал триггер на before insert, где определял billcode и заносил в табличку cdr, потом выборка упрщается и MySQL работает заметно быстрее. 

Не порадовало, такой запрос по view не воткнуть, мускул ругается, пришлось разбивать на несколько view's


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.