Есть чат между оператором и клиентом.
Все сообщения хранятся в таблице.
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`
Виртуальный выделенный сервер (VDS) становится отличным выбором
После нажатия первой кнопки включатся музыка по AlarmManagerВопрос, как выключить запущенную музыку при помощи второй кнопки? Метод cancel() не помогает...
Почему при получении количества элементов определяющих размер массива мы используем arraylength, а при получении количества элементов строки...
Как сделать фон, который находится в тексте? Текст TEKST отрисован картинкой, к примеру в png
Есть в графике labels ,в каждом из них 2 столбика , один столбик выводит рандомные числа ,а на второй не знаю как прописать скриптПомогите пожалуйста