TrueDrago
@TrueDrago

Помогите составить оптимальный запрос в mysql

В ходе доработки телефонного тарификатора столкнулся со следующей задачей.
У нас есть хранящиеся в MYSQL логи с телефонной станции, которые обсчитываются отдельным скриптом и хранят стоимость всех совершенных звонков для каждого телефона. Их можно посмотреть через специальную страничку, написанную на php, которая сводит все данные по месяцу в одну таблицу.
Сейчас требуется добавить возможность привязывать каждый телефонный номер (in_number) к определенному департаменту, причем со временем номера могут переходить из одного департамента в другой (не обязательно в начале месяца). Соответственно статистика в новой версии должна выводиться уже в таблице по департаментам в таком порядке:
  1. Название департамента
  2. Сумма затрат на каждый номер в этом месяце
  3. Сумма затрат на департамент

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

Упрощенный вариант базы можете посмотреть ниже:
/* Таблица с внутренними номерами */
CREATE TABLE IF NOT EXISTS `in_numbers` (
 `in_number` INT(3) UNSIGNED NOT NULL AUTO_INCREMENT ,
 PRIMARY KEY (`in_number`) ,
 UNIQUE INDEX `in_number_UNIQUE` (`in_number` ASC) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
/* Таблица со статистикой звонков */
CREATE TABLE IF NOT EXISTS `outgoing` (
 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
 `d_time` TIMESTAMP NULL DEFAULT NULL ,
 `in_number` INT(3) UNSIGNED NOT NULL ,
 `t_call` TIME NULL DEFAULT NULL ,
 `c_number` BIGINT(20) UNSIGNED NULL DEFAULT NULL ,
 `code` BIGINT(20) UNSIGNED NULL DEFAULT NULL ,
 `c_price` FLOAT(11,3) NULL DEFAULT NULL
 PRIMARY KEY (`id`) ,
 CONSTRAINT `outgoing_in_number`
  FOREIGN KEY (`in_number` )
  REFERENCES `in_numbers` (`in_number` )
  ON DELETE CASCADE
  ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
/* Таблица существующих департаментов */
CREATE TABLE IF NOT EXISTS `departments` (
 `department_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
 `department` VARCHAR(255) NOT NULL ,
 PRIMARY KEY (`department_id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
/* Таблица истории привязок номеров к департаментам */
CREATE TABLE IF NOT EXISTS `assigments` (
 `assigment_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
 `in_number` INT(3) UNSIGNED NOT NULL ,
 `department_id` INT(10) UNSIGNED NOT NULL ,
 `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
 PRIMARY KEY (`assigment_id`) ,
 INDEX `assigment_dep_id` (`department_id` ASC) ,
 INDEX `assigment_number` (`in_number` ASC) ,
 CONSTRAINT `assigment_dep_id`
  FOREIGN KEY (`department_id` )
  REFERENCES `departments` (`department_id` )
  ON DELETE CASCADE
  ON UPDATE CASCADE,
 CONSTRAINT `assigment_number`
  FOREIGN KEY (`in_number` )
  REFERENCES `in_numbers` (`in_number` )
  ON DELETE CASCADE
  ON UPDATE CASCADE)
ENGINE = InnoDB;

* This source code was highlighted with Source Code Highlighter.

  • Вопрос задан
  • 2689 просмотров
Решения вопроса 1
WebSpider
@WebSpider
Думаю вам поможет денормализация базы. Просто добавьте в таблицу с логами звонков поле department_id, и потом можно будет по нему производить группировку, а внутри него группировку по номерам
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽