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
预期结果:我希望它能归还给我php
和java
以及php
,java
> = {{1}的所有ID }
现在获得结果:获取17
和php
的所有ID,但如果java
的计数为>,则只计入java
。 = 17它把结果扔给我。
但我正在寻找它也应该检查java
答案 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_id
和f_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