0

table--t_id_with_data_and_count

column-f_id , f-data , f_count

它是多对多的地图table(任何id都可以有任意数量的记录(f_id并且f_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 计数的id phpjava >=17

php现在得到的结果:使用and获取所有 id java,但 count 它只检查java,如果 countjava为 >= 17,它会向我抛出结果。

但我正在寻找它也应该检查计数php

4

3 回答 3

1

由于您 group by f_idf_count因此在 havinf 子句中具有“PHP”或“JAVA”行的值。

您需要检查的f_count是 >= 17并且s的总和f_count是 >= (17 + "arbitrary" f_count)。
(换句话说:如果同时f_id具有 'PHP' 和 'JAVA' 行并且其中一个f_counts >= 17并且两个 s 的总和f_count>= (17 + the one 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

另请参阅这个简短的演示

于 2013-10-19T05:54:51.893 回答
0

HAVING 子句的条件将根据为 GROUPed 行而不是原始行计算的值进行评估。每个未分组的列显然只能包含来自其中一个组成员的值,因此您不能通过它来保证通用条件。因此,您需要将比较移至 WHERE 子句。但是您需要指定更多您想要的内容,因为有两种可能的解释。

如果f_idandf_data组合是唯一的,则最多只能有两行,因此只需检查f_countWHERE 子句就足够了:

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 并且至少有给定数量的行。

于 2013-10-19T06:52:57.987 回答
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

于 2013-10-19T06:55:40.290 回答