2013-05-01 87 views
1

以下是我正在尝试运行的查询。mysql:奇怪的错误1111组使用无效

select location_data.trip_code,sum(max(device_time)-min(device_time)) from location_data,trip_management 
where location_data.source_id=3 and location_data.trip_code=trip_management.trip_code 
group by location_data.trip_code 

存在由在两个trip_managemnet和location_data tables.these跳闸trip_code识别各种旅行采取由单个唯一标识用户(SOURCE_ID = 3)3。我在这里要做的是总结每次旅行的所有时间差异,然后使用sec_to_time函数将其转换为hh:mm:ss,以显示用户3完成所有行程所需的总时间。

上述查询的问题是,只要我在每次旅行的最大和最小device_time的差异上应用sum(),它就会生成错误1111。我不能提供一个子查询,因为这本身就是一个较大查询中的子查询。

我希望我解释得很好。

回答

3

这里的问题是,您试图对总计MAX(),MIN()应用合计SUM(),但事实上这两个级别在不同的组上运行。内部的一个分组在location_data.trip_code之上,外部的一个分组覆盖那个结果。你需要将其包装在一个子查询:

SELECT 
    trip_code, 
    /* Outer query sums the inner aggregates */ 
    SUM(max_time - min_time) AS time_sum 
FROM (
    SELECT 
    location_data.trip_code, 
    /* Inner aggregates return the max & min times only */ 
    max(device_time) AS max_time, 
    min(device_time) AS min_time 
    FROM 
    location_data, 
    INNER JOIN trip_management ON location_data.trip_code = trip_management.trip_code 
    WHERE 
    location_data.source_id=3 
    GROUP BY location_data.trip_code 
) first_group 
GROUP BY trip_code 

我也换成你加入隐与显式INNER JOIN,这是首选的语法时下。

+0

非常感谢:)但我希望避免子查询来实现结果。正如我所提到的,这个查询initself是一个更大查询中的子查询。嵌套子查询会导致性能下降,不是吗?有没有一种方法可以避免子查询保持架构,因为它是? – Salik 2013-05-01 14:48:21

+0

@ user1451836在这种情况下,FROM子查询无法避免,因为“GROUP BY”子句需要在不同的上下文中应用。这里的性能不会像在SUM()里面的子查询那样差。这可能会慢几个数量级。你的其他选择是将子查询缓存为物化视图,如果它不经常改变的话。 – 2013-05-01 15:27:59

+0

视图不会工作,因为传入的数据是实时的,创建视图会增加系统的复杂性。所以,我认为这是我的问题的答案。谢谢迈克尔:) – Salik 2013-05-01 15:50:39