2012-04-12 148 views
0

這裏是我的查詢:MySQL的SELECT JOIN和GROUP BY

SELECT v2.mac, v2.userag_hash, v2.area, count(*), count(distinct v2.video_id) 
FROM video v2 JOIN (
    SELECT distinct v.mac, v.userag_hash 
    from video v 
    WHERE v.date_pl >= '2012-01-30 00:00' AND 
    v.date_pl <= '2012-02-05 23:55' 
    ORDER BY rand() LIMIT 50 
) table2 
ON v2.mac = table2.mac AND 
    v2.userag_hash = table2.userag_hash AND 
    v2.date_pl >= '2012-01-30 00:00' AND 
    v2.date_pl <= '2012-02-05 23:55' 
GROUP BY v2.mac, v2.userag_hash 

我在數據庫中有一個表「視頻」,它包含幾千個用戶的數據,現在我要隨機選擇50個用戶和計算根據所選擇的行(每個用戶的獨特組合標識),這個查詢的結果是:

usermac1, userag_hash1, area1, 10, 5 
usermac2, userag_hash2, area2, 20, 8 
    ... 

但是,如果我沒有在查詢的末尾使用「GROUP BY」,那麼它會只返回一行: usermac,userag_hash,areax,1500,700(不知道此行代表)

我想知道,如果「1500,700」是以前的結果的最後兩列的總和。像1500 = 10 + 20 + ... 700 = 5 + 8 + ...

回答

1

基於該事實,即只有一個集合函數(計數)和2列中使用,並且可以不GROUP運行它畢竟,你必須使用不符合標準的MySQL。

SELECT v2.mac, v2.userag_hash, v2.area, count(*), count(distinct v2.video_id) 
... 

無論您的數據是,MySQL將返回當您使用聚合函數一列,那就是:

<undefined value>, <undefined value>, count of all rows, count of rows where v2.video_id is distinct (and probably non null). 

所以我認爲你有1500行,和700個不同v2.video_id的值,或700個非空的不同值。要測試這個空的想法,請嘗試:

count(distinct IFNULL(v2.video_id,'nullvaluehere')) 

它將將NULL值轉換爲非null值,以便將它們包括在內。

「未定義的值」可能是第一行,最後一行,第一個是非空,第一個在索引中,第一個在某個緩存中,等等。沒有定義當你寫一個無效查詢。

每個SQL數據庫我知道的比MySQL其他會給你一個錯誤信息,甚至無法運行查詢。爲使查詢有效,它必須包含組中的所有非聚合列。例如。 mac和userag_hash都必須在group by中。

+0

你是對的各個方面,除了一兩件事。如果'GROUP BY'中使用的列(在本例中爲'v2.mac,v2.userag_hash')唯一標識'v2'的行,那麼不存在未定義的行爲。 – 2012-04-12 13:08:47