需要获取mysql结果

时间:2015-12-02 06:39:19

标签: mysql mysqli

我有以下mysql表结构,

    id   product_id       filter_tag_id     
14      1               48  
17      3               49  
18      10              49  
19      10              54  
20      11              49  
21      11              55  
22      12              49  
23      12              56  
24      9               48  
25      9               52  
26      6               48  
27      6               53  
28      7               48  
29      7               56  
30      8               48  
31      8               53 
32      13              48  
33      13              52  
34      14              48  
35      14              54
36      14              55
37      15              48  
38      15              55  

我只需要获取那些具有相同filter_tag_id的product_id' 例如,只有一个product_id(9和13)具有相同的filter_tag_id(48和52),所以我只需要获取product_id 9和13,我正在尝试以下查询,但还没有成功。

select product_id from filter_data where filter_tag_id=52 AND filter_tag_id=48;
select product_id from filter_data where filter_tag_id in (52,48);

第一个查询返回没有结果,第二个返回错误结果

3 个答案:

答案 0 :(得分:0)

使用GROUP BY

Select product_id,COUNT(DISTINCT filter_tag_id) filter_match 
from filter_data where filter_tag_id in (52,48)
GROUP BY product_id
HAVING filter_match = 2

filter_match的值是您将通过in条件

的计数

答案 1 :(得分:0)

如果您想要的是仅查找product_idfilter_tag_id值等于48 52 并且除了这两个值之外别无其他,然后尝试:

SELECT product_id
FROM mytable
GROUP BY product_id
HAVING COUNT(CASE WHEN filter_tag_id = 48 THEN 1 END) > 0 AND
       COUNT(CASE WHEN filter_tag_id = 52 THEN 1 END) > 0 AND
       COUNT(CASE WHEN filter_tag_id NOT IN (48,52) THEN 1 END) = 0

Demo here

答案 2 :(得分:0)

使用自我加入。它看起来比GROUP BY更复杂,但它比group-by更快。因为使用GROUP BY方法,只有48或52的那些应该被分组,这不是不需要的行。

SELECT t1.product_id
FROM filter_data t1 INNER JOIN filter_data t2 ON t1.product_id = t2.product_id
WHERE t1.filter_tag_id = 48 AND t2.filter_tag_id = 52;