仅从mariadb表中提取完全匹配的行

问题描述

我有一个如下表

Create Table tmp_test (
    id int(11) unsigned Auto_increment primary key,contract_id int(11) unsigned,item_id int(11) unsigned
);

Insert Into tmp_test (contract_id,item_id)
Values (10,1),(10,2),3),(12,(14,(16,4),(18,(20,(22,(24,4);

当我们选择查询

1。 选择不同的contract_id 来自tmp_test 其中FIND_IN_SET(item_id,'1,2');

需要输出

12,18
  1.   Select distinct contract_id 
      From tmp_test 
      Where FIND_IN_SET(item_id,'1'); 
    

需要输出

14
  1.   Select distinct contract_id 
      From tmp_test 
      Where FIND_IN_SET(item_id,'1,2,3'); 
    

需要输出

10,20
  1.   Select distinct contract_id 
      From tmp_test 
      Where FIND_IN_SET(item_id,'4,1'); 
    

需要输出

24

请帮助我在单个查询中实现

此致

失败

解决方法

您希望contract_id拥有输入列表的所有值,而没有其他值。

您可以使用聚合和having子句来表达这一点:

select contract_id
from tmp_test
group by item_id
having sum(item_id in (1,2)) = 2 and sum(item_id not in (1,2)) = 0

或者,如果您更喜欢find_in_set()

having sum(find_in_set(item_id,'1,2')) = 2 and sum(find_in_set(item_id,2') = 0) = 0
,
Select contract_id From (
Select contract_id,group_concat(item_id order By item_id) items From tmp_test 
Group By contract_id  ) sb
Where items Like '1,2';