查询以查找存在较大集的子集的行

时间:2015-02-12 00:12:49

标签: mysql sql

必须有一个简单的解决方案,我找不到或弄清楚,但它让我疯了

有一张表A

id 
1
2
3

有一张表B

id 
a
b
c

表A_B

之间存在多对多的关系
a_id    b_id
 1       a
 1       c
 1       b
 2       a
 2       c
 3       b

我想要一个具有一组B元组的输入的查询,并找出A的元组中的哪一个作为子集。

例如

Input c
Output {1,2}

Input {a,c}
Output {1,2}

Input {a,b}
Output {1}

Input {b}
Output {1,3}

我提出这样做​​的唯一方法是为每个单独的标签选择所有行并在这些行上执行交集。这似乎效率低下。

2 个答案:

答案 0 :(得分:4)

这个查询应该做你想要的; in列表中的项目数必须与having的参数匹配:

select a_id from table_A_B
where b_id in ('a','c')
group by a_id having count(distinct b_id) = 2

只有在允许重复行时才需要distinct

在您的测试用例中查看此sample SQL Fiddle

答案 1 :(得分:0)

您可以在inner joinA_B a_idb_id表格,这将提供所提供的select c.a_id from A_B as c where c.b_id = 'c'; select a.a_id from A_B as a inner join A_B as c on c.a_id = a.a_id where a.b_id = 'a' and c.b_id = 'c'; select a.a_id from A_B as a inner join A_B as b on b.a_id = a.a_id where a.b_id = 'a' and b.b_id = 'b'; select b.a_id from A_B as b where b.b_id = 'b'; 值之间的值的交集:

{{1}}

SQL FIDDLE