2013-02-03 41 views
0

我有一个查询需要它来从两个单独的表中选择两个不同时间的平均时间差。多行的MySQL AVG TimeDiff

在查询的下一部分进来之前,这看起来很容易:我必须根据学生进入办公室的原因进行分组。所以现在这个查询需要:

  1. 选择的原因(为什么)
  2. 伯爵学生已经多少次进来这个原因计数(为什么)
  3. 然后,我需要检查从AVG时间开始时间到结束时间。请记住,我是按原因分组的。这意味着我需要timediff来计算所有符合学生访问原因的记录差异。

我写此查询:

SELECT why, 
    count(why), 
    SEC_TO_TIME(AVG(MAX(support.finishtime) - session.signintime)) 
    FROM session 
    LEFT JOIN support 
     ON support.session_id = session.session_id 
    WHERE status = 3 
    GROUP BY why; 

但是我得到一个错误:

ERROR 1111(HY000):无效使用组功能的

我不t似乎理解这个问题。从阅读过去他们正在考虑使用的问题?但我不明白在这种情况下如何甚至在何处添加having子句。

任何帮助将不胜感激。

谢谢

+0

尝试取出MAX功能。我怀疑mySQL试图使用MAX组而不是MAX函数 –

+0

以及我必须使用max,因为每个会话(为什么与之相关)都有多​​个可以在其上工作的顾问。所以我希望登录会话的开始时间(登录时间)和结束时间的最后时刻,这将是时间戳的最大值(MAX)。 – RaGe10940

回答

0
SELECT 
session.why AS Reason, 
COUNT(session.why) AS Count, 
SEC_TO_TIME(AVG(TIMEDIFF(t.fin, session.signintime))) AS Time 
FROM session 
LEFT JOIN (SELECT support.session_id, MAX(support.finishtime) AS fin 
FROM support 
GROUP BY support.session_id) AS t 
    ON session.session_id = t.session_id 
WHERE session.status = 3 
GROUP BY session.why 
ORDER BY session.signintime DESC 

这完美地完成了这项工作!我刚刚几个小时前就明白了,我从来没有真正使用过子查询,所以我的教授帮助我解决了这个问题。

0

好吧,看在这一点,我在想,你想要的是一个嵌套查询来获取最大的支持记录。要做到这一点

一种方法是:

SELECT why, 
    count(why), 
    SEC_TO_TIME(AVG((select max(finishtime) from 
       support where support.session_id = session.session_id) - 
     session.signintime)) 
    FROM session 
    WHERE status = 3 
    GROUP BY why; 

我已经创建SQL Fiddle,所以你可以看一下,我用的是表结构。

+0

不,我需要得到一个学生在办公室里的平均时间。选择完成时间不成问题,当我必须对两者进行平均和时间差时,问题就出现了。那是我坚持的地方。 – RaGe10940

+0

你可以在SQLFiddle中发布你的模式,一些数据和预期的结果吗? –