2017-01-24 12 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は」に関連した列の時間差分を取ることによって、コースに費やした時間を計算したいが、私のクエリは次のとおりです。

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 
関連する問題