仅在mysql

时间:2018-02-15 13:59:32

标签: mysql sql

我有3个表,其中2个(AB)有多对多关系,它们通过pivot C表连接。表desc:

A(id, name)
B(id, is_required)
C(a_id, b_id)

我想从A表中选择记录,来自B表的相关记录ID在提供的输入中并且符合某些条件。例如: 以免我说我有整数(ids)[1,2,3,4,8,12]列表,A中的一条记录有B的5条相关记录,例如:

A
id    name
1     test
-------------
B
id   is_required
1    true
2    true
3    false
10   false
16   false

我需要从表A中选择记录来加入表B中的相关记录,然后检查 - 是否存在is_required = true所有必需(B)记录ID列表([1,2,3,4,8,12])然后我们选择此记录,否则不选择。所以应该选择第一个例子,因为B(1和2)中的所有必需记录都存在于列表中。例如:

A
id    name
2     test2
-------------
B
id   is_required
1    true
2    true
5    true
6    false
不应选择

,因为列表中未提供id为5的必需记录。我怎么能在mysql中实现这个?查询示例:

SELECT A.id, A.name FROM A, B, C
WHERE A.id = C.a_id
AND  C.b_id = B.id

如你所见,目前它只加入相关数据,我真的不知道应该如何实现这一点。你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我相信您需要NOT EXISTS

select A.*
from A
where not exists(
  select 1
  from C
  join B on C.b_id = B.id and
            A.id = C.a_id and
            is_required = 'false'
)

答案 1 :(得分:1)

您可以使用group byhaving

select c.a_id
from c join
     b
     on c.b_id = b.id and b.is_required = 'true'
group by c.a_id
having count(*) = (select count(*) from b where b.is_required = 'true');