MySQL View - Журнал приложения - захват данных из другого View для группировки проблемы с данными на выходе - PullRequest
0 голосов
/ 02 июля 2019

Я занимаюсь разработкой веб-приложения с использованием Yii2 Framework и базы данных, использующей MySQL

, в системе одно из требований включает в себя функцию журнала приложения, которая фиксирует весь журнал, сделанный в приложении, и необходимость фильтрации по обработкедень

журнал содержит период даты, который состоит из 2 столбцов

log_startdate и log_enddate

представление sql было создано для захвата интервала времени между этими двумя датами (интервал времени минус праздничные и выходные дни)

мы называем это first_view_sql

для второго представления, которое я создал для группировки по интервалу времени по определенному kpi_stage

KPI означает производительность ключаИндикатор

во время второго просмотра системы всегда дает сбой из-за слишком большой загрузки данных, и модель yii2, которая используется для загрузки настольной системы на тексах навсегда, чтобы загрузить

, я пробовал использовать ниже секундыпосмотреть sql

SELECT
  log_id,
  application_id,
  kpi_stage,
  SUM(diff_day) AS sum_diff_day,
  SUM(diff_day) + FLOOR((SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0))/60) AS mod_sum_diff_day,
  -- SUM(diff_hour) AS sum_diff_hour,
  MOD(SUM(diff_hour) + FLOOR((SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0))/60),24) as mod_sum_diff_hour,
  -- SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0) AS sum_diff_minute,
  MOD(SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0),60) AS mod_sum_diff_minute,
  -- SUM(diff_second) AS sum_diff_second,
  MOD(SUM(diff_second),60) AS mod_sum_diff_second
FROM
  processing_day
WHERE log_type_id = 1
AND application_id = 1
GROUP BY(kpi_stage) 

и он работает быстро и точно, но где "И приложениеon_id = 1 "нельзя использовать, потому что second_view_sql должен загружать все приложения, чтобы иметь возможность фильтровать по дням обработки в режиме реального времени

application_log - таблица, в которой хранятся все данные, ниже - DDL

CREATE TABLE `application_log` (
  `log_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `application_id` int(11) unsigned DEFAULT NULL,
  `application_status_id` int(11) unsigned DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  `log_startdate` datetime DEFAULT '1000-01-01 00:00:00',
  `log_enddate` datetime DEFAULT '1000-01-01 00:00:00',
  `log_type_id` tinyint(4) unsigned DEFAULT 1,
  PRIMARY KEY (`log_id`),
  KEY `log_id` (`log_id`),
  KEY `application_id` (`application_id`),
  KEY `application_status_id` (`application_status_id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

first_view_sql это

SELECT
  application_log.log_id,
  application_log.application_id,
  application_log.log_startdate,
  application_log.log_enddate as log_enddate_original,
  application_log.application_status_id,
  (CASE 
    WHEN application_status_id IN(2,3,17) THEN 1
    WHEN application_status_id IN(16,19,20,21,27,28,29,26,31,4,5,6,7,10,9,8) THEN 2
    WHEN application_status_id IN(22,23,24,11,12,18) THEN 3
    WHEN application_status_id IN(25,13,14) THEN 4
    ELSE 0
  END) AS kpi_stage,
  IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate) as log_enddate_fix,
  application_log.log_type_id,
  (SELECT COUNT(*) FROM event_date WHERE (event_date.a_day BETWEEN log_startdate AND IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) AND DAYNAME(event_date.a_day) NOT IN ('Saturday','Sunday') ) as holiday,
  (SELECT COUNT(*) FROM calendar WHERE (calendar.a_day BETWEEN log_startdate AND IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) AND (DAYNAME(calendar.a_day) IN ('Saturday','Sunday') ) ) as diff_weekend,
  GREATEST(FLOOR(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) / 24),0) as diff_day_original,
  GREATEST((FLOOR(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) / 24) - (SELECT COUNT(*) FROM calendar WHERE (calendar.a_day BETWEEN log_startdate AND IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) AND (DAYNAME(calendar.a_day) IN ('Saturday','Sunday') ) ) ),0) as diff_day,
  GREATEST(MOD(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 24),0) as diff_hour,
  GREATEST(MOD(TIMESTAMPDIFF(MINUTE,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0) as diff_minute,
  GREATEST(MOD(TIMESTAMPDIFF(SECOND,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0) as diff_second,
  -- date_f = diff_day - diff_weekend - holiday 
  CONCAT(
   GREATEST((FLOOR(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) / 24) - (SELECT COUNT(*) FROM calendar WHERE (calendar.a_day BETWEEN log_startdate AND IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) AND (DAYNAME(calendar.a_day) IN ('Saturday','Sunday') ) ) ),0), ' days ',
   GREATEST(MOD(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 24),0), ' hours ',
   GREATEST(MOD(TIMESTAMPDIFF(MINUTE,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0), ' minutes ',
   GREATEST(MOD(TIMESTAMPDIFF(SECOND,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0),' seconds ') as date_f,
  CONCAT(
   GREATEST((FLOOR(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) / 24) - (SELECT COUNT(*) FROM calendar WHERE (calendar.a_day BETWEEN log_startdate AND IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) AND (DAYNAME(calendar.a_day) IN ('Saturday','Sunday') ) ) ),0), ':',
   GREATEST(MOD(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 24),0), ':',
   GREATEST(MOD(TIMESTAMPDIFF(MINUTE,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0), ':',
   GREATEST(MOD(TIMESTAMPDIFF(SECOND,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0)) as diff_formated
FROM
  application_log 

второй вид sql


SELECT
  log_id,
  application_id,
  kpi_stage,
  SUM(diff_day) AS sum_diff_day,
  SUM(diff_day) + FLOOR((SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0))/60) AS mod_sum_diff_day,
  -- SUM(diff_hour) AS sum_diff_hour,
  MOD(SUM(diff_hour) + FLOOR((SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0))/60),24) as mod_sum_diff_hour,
  -- SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0) AS sum_diff_minute,
  MOD(SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0),60) AS mod_sum_diff_minute,
  -- SUM(diff_second) AS sum_diff_second,
  MOD(SUM(diff_second),60) AS mod_sum_diff_second
FROM
  processing_day
WHERE log_type_id = 1
GROUP BY(kpi_stage) 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...