【问题标题】:select record only if specific related values are provided in mysql仅当 mysql 中提供了特定的相关值时才选择记录
【发布时间】:2018-02-15 13:59:31
【问题描述】:

我有 3 个表,其中 2 个(AB)有多对多关系,它们通过枢轴 C 表连接。表格描述:

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 中加入相关记录,并检查 - 如果我的列表 ([1,2,3,4,8,12]) 中存在来自 B 的所有必需 (is_required = true) 记录 ID,那么我们选择这条记录,否则不选择。所以应该选择第一个示例,因为来自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

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

【问题讨论】:

标签: mysql sql


【解决方案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'
)

【讨论】:

  • 谢谢,我尝试过类似的事情,但是在这个例子中我应该检查B.id是否存在于提供的ID中?
  • @devnullΨ 我认为您的输入和预期输出不是 100%。您应该指定所有表(C 以及)、您的输入(提供 B.ids?)和它的预期输出。
【解决方案2】:

您可以使用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');

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2016-05-23
    相关资源
    最近更新 更多