2013-05-01 59 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