| Pointid | Productid | 
|---|---|
| 5 | 24 | 
| 6 | 24 | 
| 6 | 25 | 
| 6 | 26 | 
| 7 | 24 | 
| 7 | 25 | 
| 7 | 26 | 
| 7 | 27 | 
For the query:
select distinct pointid from mytable where productid in (24,25,26)
The result is: 5,6,7
But I want only 6. No more No less..
How can I do it?
Advertisement
Answer
The main goal is to find those pointid where their productid are EXACTLY 24, 25, 26. Importantly: no more, no less.
In essence, you are requiring two distinct conditions:
- 
- That the 
pointidcontains ALL of the followingproductids;24, 25, 26, and, 
 - That the 
 - 
- That the 
pointiddoes not contain any otherproductid. 
 - That the 
 
Both conditions can be addressed with a having clause.
- 
- You make sure that it contains all of the 
productids. As there are 3, you want the count of theproductids that match24, 25, 26, to be exactly 3:COUNT(DISTINCT CASE WHEN productid in (24, 25, 26) THEN productid END) = 3. 
 - You make sure that it contains all of the 
 - 
- You want it to contain no other 
productid. So you make sure that the total value of distinctproductids is 3:COUNT(DISTINCT productid) = 3. 
 - You want it to contain no other 
 
The following query puts it all together:
SELECT pointid FROM mytable GROUP BY pointid HAVING COUNT(DISTINCT CASE WHEN productid in (24, 25, 26) THEN productid END) = 3 AND COUNT(DISTINCT productid) = 3 ;
If you wanted to do something similar with different conditions (as you mentioned in your comments):
- Replace 
24,25,26, for theproductids that you want to check. - Replace 
3for the number ofproductids that you are checking.