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, и потом можно будет по нему производить группировку, а внутри него группировку по номерам
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы