2013-10-19 57 views
0

table - t_id_with_data_and_countMySQL的GROUP BY查詢

column - f_id , f-data , f_count

它是一個多對多的地圖table(任何id可以有任意數量的記錄(含f_idf_data組在本質上是獨一無二的))

SELECT * FROM t_id_with_data_and_count where f-data IN ('PHP','JAVA') GROUP BY 1 HAVING COUNT(*)= 2 AND f_count >=17

預期的結果:我期待着我T應當返回我誰是有phpjavaphp計數,所有的ID java> = 17

結果現在越來越:讓所有的IDS既phpjava,但指望它只是檢查java,如果計數爲java> = 17它將結果拋出。

,但我期待它也應該havinf子句中檢查的php

回答

1

計數既然你按f_idf_count設有一張「PHP」或「JAVA」這一行的價值。

你需要檢查什麼是f_count爲> = 17 說的f_count S中的總和> =(17 +的 「任意」 f_count)。
(換句話說:如果f_id既有「PHP」和「JAVA」行f_count S的一個是> = 17 兩個f_count S的總和是> =(17 +的一個f_count(我們檢查是> = 17)然後,我們找到了一個匹配!)

SELECT * 
    FROM t_id_with_data_and_count 
    WHERE f_data IN ('PHP', 'JAVA') 
    GROUP BY f_id 
    HAVING COUNT(f_id) = 2 
    AND f_count >= 17 
    AND SUM(f_count) >= f_count + 17 

還參見本short demo

+0

SUM不列入保障個人計..每個單獨計數應> = 17 – Aditya

+0

對不起,我誤解你的要求。我會照顧它... – gkalpak

+0

如果你有一個新的問題,請點擊[問問題](http://stackoverflow.com/questions/ask)按鈕。如果有助於提供上下文,請包含此問題的鏈接。 –

0

在HAVING條件子句將根據爲GROUPed行計算的值進行評估,而不是原始行。每個非分組列顯然可以只包含來自其中一個組成員的值,因此您無法通過它保證通用條件。因此您需要將您的比較移至WHERE子句。但是你需要指定更多你想要的東西,因爲有兩種可能的解釋。

如果f_idf_data組合是唯一的只能有最多兩行,所以乾脆在檢查f_count WHERE子句是不夠的:

SELECT * 
FROM t_id_with_data_and_count 
WHERE f_data IN ('PHP','JAVA') 
    AND f_count >= 17 
GROUP BY f_id 
HAVING COUNT(*); 

否則,你需要指定你是否需要至少兩行的足夠大的計數,或者如果您想行的所有的id和一組語言有f_count >= 17至少有一個給定數量的他們。

0

SELECT f_id FROM t_id_with_data_and_count WHERE f_data IN ('PHP','JAVA') AND f_count >=17 GROUP BY f_id HAVING COUNT( DISTINCT f_data) = 2