2017-01-24 1 views
1

나는 테이블 analyticsrecords 있습니다이 MySQL 쿼리를 단순화 할 수 있습니까?

------------------------------------------------------------------------------- 
recordDataId | analyticsReferenceDataId | analyticsDataKey | analyticsDataValue 
-------------------------------------------------------------------------------- 
16 | 114621208-20161122174835 | recordtype | Course ID 
17 | 114621208-20161122174835 | recordtypeid | 78 
18 | 114621208-20161122174835 | pageStart | Tue Nov 22 2016 17:48:13 
19 | 114621208-20161122174835 | pageEnd | Tue Nov 22 2016 17:48:34 

내가 열 값 'datavalue'와 관련된 열 시간은 diff를 취함으로써 과정에 소요되는 시간을 계산하려면를 내 쿼리는 다음과 같습니다

SELECT 
    IFNULL((SELECT 
       TIMESTAMPDIFF(SECOND, 
           STR_TO_DATE((SELECT analyticsDataValue 
             FROM analyticsrecorddata 
             WHERE analyticsDataKey = "pageStart" 
             AND analyticsReferenceDataId ='114621208-20161122174835'), '%a %b %d %Y %T'), 
           STR_TO_DATE((SELECT analyticsDataValue 
             FROM analyticsrecorddata 
             WHERE analyticsDataKey = "pageEnd" 
             AND analyticsReferenceDataId ='114621208-20161122174835'), '%a %b %d %Y %T') 
      )), 0) AS Time_spent, 
    (SELECT analyticsDataValue 
    FROM analyticsrecorddata 
    WHERE analyticsDataKey = "recordtypeid" 
     AND analyticsReferenceDataId ='114621208-20161122174835') AS Course_id 
FROM 
    `analyticsrecords` 
GROUP BY 
    analyticsReferenceDataId 

이 쿼리를 단순화하고 더 효율적으로 만들 수 있습니까? 17000 행을 계산하는 데 14 초가 걸립니다.

+0

단순히 적절한 데이터 유형을 사용하여 데이터를 저장할 수 있습니까? – Strawberry

+0

아니요, 다른 유형의 데이터를 가질 수있는 분석 데이터입니다.이 표는 원래 이벤트 (클릭, 소요 시간 등)와 결합됩니다. – Gokul

+0

EAV 모델을 사용하는 경우에도 각 데이터 유형에 대해 별도의 "공백"(이 경우 "테이블")을 갖는 것이 좋습니다. – Strawberry

답변

0
select courseid,recordtypeid, 
      str_to_date(pagestart ,'%a %b %d %Y %T') pagestart, 
      str_to_date(pageend ,'%a %b %d %Y %T') pageend, 
      timediff(str_to_date(pageend ,'%a %b %d %Y %T'), str_to_date(pagestart ,'%a %b %d %Y %T')) time_on_course 
from 
(
select analyticsReferenceDataId, 
      max(case when ltrim(rtrim(analyticsDataKey)) = 'recordtype' then analyticsDatavalue end) courseid, 
      max(case when ltrim(rtrim(analyticsDataKey)) = 'recordtypeid' then analyticsDatavalue end) recordtypeid, 
      max(case when ltrim(rtrim(analyticsDataKey)) = 'pageStart' then analyticsDatavalue end) pagestart, 
      max(case when ltrim(rtrim(analyticsDataKey)) = 'pageEnd' then analyticsDatavalue end) pageend 
from analyticsrecords 
group by analyticsReferenceDataId 
) s 
관련 문제