Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以简化这个MySQL查询吗?_Mysql_Sql - Fatal编程技术网

我可以简化这个MySQL查询吗?

我可以简化这个MySQL查询吗?,mysql,sql,Mysql,Sql,我有一张表格分析记录: ------------------------------------------------------------------------------- recordDataId | analyticsReferenceDataId | analyticsDataKey | analyticsDataValue ------------------------------------------------------------------------------

我有一张表格
分析记录

-------------------------------------------------------------------------------
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

我可以简化此查询并使其更高效吗?这将需要14秒来计算17000行。

您不能简单地使用适当的数据类型来存储数据吗?不,我们不能,它是一种分析数据,可以有不同类型的数据,此表与原始事件(单击、花费的时间等)连接。即使使用EAV模型,我仍然认为使用单独的“空间”是一种很好的做法(在本例中为每种数据类型的“表”)。您不能简单地使用适当的数据类型存储数据吗?不,我们不能,它是一种分析数据,可以有不同类型的数据,此表与原始事件(单击、花费的时间等)连接。即使使用EAV模型,我仍然认为使用单独的“空间”(在本例中为“表”)是一种良好的做法对于每种数据类型。
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