MySQL GROUP BY查询

时间:2013-10-19 05:46:14

标签: mysql

table - t_id_with_data_and_count

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

预期结果:我希望它能归还给我phpjava以及phpjava> = {{1}的所有ID }

现在获得结果:获取17php的所有ID,但如果java的计数为>,则只计入java。 = 17它把结果扔给我。

但我正在寻找它也应该检查java

的数量

3 个答案:

答案 0 :(得分:1)

由于您按f_id分组,因此havinf子句中的f_count具有'PHP'或'JAVA'行的值。

您需要检查的是f_count是> = 17 f_count s的总和是> =(17 +“任意” f_count)。
(换句话说:如果f_id同时包含'PHP'和'JAVA'行,则其中一个f_count是> = 17 两个f_count的总和是> =(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

答案 1 :(得分:0)

将根据为GROUPed行计算的值而不是原始行计算HAVING子句的条件。每个非分组列显然只能包含其中一个组成员的值,因此您无法保证通过它的通用条件。因此,您需要将比较移动到WHERE子句。但是你需要更多地指定你想要的东西,因为有两种可能的解释。

如果f_idf_data组合是UNIQUE,那么最多只能有两行,所以只需在WHERE子句中检查f_count即可:

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 至少有一定数量的。

答案 2 :(得分: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