Есть чат между оператором и клиентом.
Все сообщения хранятся в таблице.
CREATE TABLE IF NOT EXISTS `message` (
`id` INT NOT NULL AUTO_INCREMENT,
`chatId` INT NOT NULL DEFAULT -1,
`type` VARCHAR(50) NULL DEFAULT 'CLIENT',
`message` LONGTEXT NULL,
`time` VARCHAR(255) NULL,
`date` VARCHAR(255) NULL,
`status` TINYINT(1) NULL DEFAULT 0,
`created` TIMESTAMP(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
ENGINE = InnoDB;
Нужно определить среднее время ответа оператора клиенту. Каким образом это лучше сделать? Выгрузить все сообщения в цикле обработать? (тут свою уже нюансы ибо нужно учитывать сообщение клиента а после ответ оператора) Или можно сделать запросом?
Для MySql, если игнорировать условия в колонках кроме type, и использовать временные таблицы для упрощения.
Создание таблицы и заполнение данными:
-- MySQL dump 10.13 Distrib 5.7.17, for Win64 (x86_64)
--
-- Host: localhost Database: world
-- ------------------------------------------------------
-- Server version 5.7.21-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `message`
--
DROP TABLE IF EXISTS `message`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`chatId` int(11) NOT NULL DEFAULT '-1',
`type` varchar(50) DEFAULT 'CLIENT',
`message` longtext,
`time` varchar(255) DEFAULT NULL,
`date` varchar(255) DEFAULT NULL,
`status` tinyint(1) DEFAULT '0',
`created` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `message`
--
LOCK TABLES `message` WRITE;
/*!40000 ALTER TABLE `message` DISABLE KEYS */;
INSERT INTO `message` VALUES (1,1,'CLIENT','111111',NULL,NULL,0,'2018-06-15 09:56:32.654668'),(2,1,'OPERATOR','222222',NULL,NULL,0,'2018-06-15 09:57:14.252800'),(3,2,'CLIENT','333333',NULL,NULL,0,'2018-06-15 09:59:37.853248'),(4,2,'OPERATOR','44444',NULL,NULL,0,'2018-06-15 09:59:51.799293');
/*!40000 ALTER TABLE `message` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2018-06-15 13:01:31
Запросы
DROP TABLE IF EXISTS T0;
DROP TABLE IF EXISTS T1;
-- первое сообщение в чате от пользователя
-- если первое сообщение не от пользователя, то не включается в результат
CREATE TEMPORARY TABLE T0
(
select
M0.`id`,
M0.`chatId`,
M0.`created`
from `message` as M0
join (
select
`chatId` as `chatId`,
min(`created`) as `created`
from
`message`
group by
`chatId`
)
as M1 on M0.chatId = M1.chatId and M0.`created` = M1.`created`
where
M0.type = 'CLIENT' -- клиент первый
)
;
-- первое сообшение в чате от оператора (может быть вторым или больше, если пользователь написал оператору несколько раз)
CREATE TEMPORARY TABLE T1
(
select
M0.`chatId`,
M0.`created`
from `message` as M0
join (
select
M7.`chatId` as `chatId`,
min(M7.`created`) as `created`
from
`message` as M7
join T0 on M7.chatId = T0.chatId
where
T0.id != M7.id -- исключили первую запись
and M7.type != 'CLIENT' -- не клиент
group by
M7.`chatId`
)
as M1 on M0.chatId = M1.chatId and M0.`created` = M1.`created`
)
;
-- сообщения , оставшиеся без ответа, игнорируем
select
AVG(T1.`created` - T0.`created`) as `response_avg`
from T0
join T1 on T0.`chatId` = T1.`chatId`
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости