多行的MySQL AVG TimeDiff

时间:2013-02-03 00:50:29

标签: mysql select

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

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

  1. 选择原因(原因)
  2. 计算一名学生因此而入学的次数(为什么)
  3. 然后我需要检查从开始时间到结束时间的AVG时间。请记住,我按原因分组。这意味着我需要timediff来计算属于学生访问原因的所有记录的差异。
  4. 我写了这个查询:

     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):无效使用群组功能

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

    非常感谢任何帮助。

    谢谢

2 个答案:

答案 0 :(得分:1)

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

这完美地完成了这项工作!我刚刚在几个小时前得到它,我从未真正使用过子查询,所以我的教授帮助我解决了这个问题。

答案 1 :(得分: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,因此您可以查看我正在使用的表结构。