2013-10-19 169 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