Mysql 仅当主查询包含子查询返回的所有行时返回

Mysql 仅当主查询包含子查询返回的所有行时返回,mysql,sql,Mysql,Sql,我想编写一个查询,当且仅当它具有子查询将返回的所有ID时,才会返回数据 我所尝试的: SELECT * FROM main_table WHERE id IN ( SELECT id FROM sub_table WHERE SOMECODITION) 但一旦在子查询中找到至少一个我不想要的匹配行,它就会返回 我主要想检查主表是否有子表返回的所有ID 编辑: SOMECONDITION与主查询无关这在MySQL中是相当痛苦的。以下内容获取匹配数: SELECT COUNT(DISTINCT i

我想编写一个查询,当且仅当它具有子查询将返回的所有ID时,才会返回数据

我所尝试的:

SELECT * FROM main_table WHERE id IN ( SELECT id FROM sub_table WHERE SOMECODITION)
但一旦在子查询中找到至少一个我不想要的匹配行,它就会返回

我主要想检查主表是否有子表返回的所有ID

编辑:


SOMECONDITION与主查询无关

这在MySQL中是相当痛苦的。以下内容获取匹配数:

SELECT COUNT(DISTINCT id)
FROM main_table
WHERE id IN ( SELECT id FROM sub_table WHERE SOMECODITION);
如果您只想选择行,我建议您使用php获取计数,并在那里使用条件逻辑。但是,您也可以在SQL中执行此操作:

SELECT mt.*
FROM main_table mt
WHERE mt.id IN ( SELECT st.id FROM sub_table st WHERE SOMECONDITION) AND
      (SELECT COUNT(DISTINCT mt.id)
       FROM main_table mt
       WHERE mt.id IN (SELECT st.id FROM sub_table st WHERE SOMECONDITION)
      ) =
      (SELECT COUNT(DISTINCT st.id) FROM sub_table st WHERE SOMECONDITION);

这在MySQL中是相当痛苦的。以下内容获取匹配数:

SELECT COUNT(DISTINCT id)
FROM main_table
WHERE id IN ( SELECT id FROM sub_table WHERE SOMECODITION);
如果您只想选择行,我建议您使用php获取计数,并在那里使用条件逻辑。但是,您也可以在SQL中执行此操作:

SELECT mt.*
FROM main_table mt
WHERE mt.id IN ( SELECT st.id FROM sub_table st WHERE SOMECONDITION) AND
      (SELECT COUNT(DISTINCT mt.id)
       FROM main_table mt
       WHERE mt.id IN (SELECT st.id FROM sub_table st WHERE SOMECONDITION)
      ) =
      (SELECT COUNT(DISTINCT st.id) FROM sub_table st WHERE SOMECONDITION);
在这种情况下,您需要一个内部联接

SELECT m.* FROM main_table INNER JOIN sub_table s ON m.id = s.id WHERE SOMECODITION
我假设somecodion只包含sub_表的条件。使用SOMECODITION,可以保证来自sub_表的结果必须满足条件,并且使用内部联接,来自sub_表的所有id必须在main_表中找到,以便从main_表返回某些内容。

在这种情况下,您需要一个内部联接

SELECT m.* FROM main_table INNER JOIN sub_table s ON m.id = s.id WHERE SOMECODITION

我假设somecodion只包含sub_表的条件。使用SOMECODITION,可以保证来自sub_表的结果必须满足条件,并且使用内部联接,来自sub_表的所有id必须在main_表中找到,以便从main_表返回某些内容。

您也可以通过使用left JOIN来实现这一点。例如,让我们举一个小例子MIN表,IDS 1,2,3和Sub表有IDS 1,2,5/6,它们符合状态,所以下面的查询,

select s.id sid,m.id mid from 
sub_table s left join main_table m on s.id = m.id where s.SOMECONDITION
将导致:

sid     mid
1       1
2       2
5       null
6       null
在这种情况下,主表没有子查询返回的所有ID。 只有当计数是等于CurtMID时,才能使用计数来获取结果,因为计数不考虑空值。因此,您的查询将成为

SELECT * FROM main_table 
WHERE id IN ( SELECT id FROM sub_table WHERE SOMECODITION)
AND
(select count(Distinct sid) 
from (select s.id sid,m.id mid from sub_table s left join main_table m on 
s.id = m.id where s.SOMECONDITION) )
= (select count(Distinct mid) 
from (select s.id sid,m.id mid from sub_table s left join main_table m on 
s.id = m.id where s.SOMECONDITION) )

您也可以通过使用左连接来实现这一点。例如,让我们举一个小例子MIN表,IDS 1,2,3和Sub表有IDS 1,2,5/6,它们符合状态,所以下面的查询,

select s.id sid,m.id mid from 
sub_table s left join main_table m on s.id = m.id where s.SOMECONDITION
将导致:

sid     mid
1       1
2       2
5       null
6       null
在这种情况下,主表没有子查询返回的所有ID。 只有当计数是等于CurtMID时,才能使用计数来获取结果,因为计数不考虑空值。因此,您的查询将成为

SELECT * FROM main_table 
WHERE id IN ( SELECT id FROM sub_table WHERE SOMECODITION)
AND
(select count(Distinct sid) 
from (select s.id sid,m.id mid from sub_table s left join main_table m on 
s.id = m.id where s.SOMECONDITION) )
= (select count(Distinct mid) 
from (select s.id sid,m.id mid from sub_table s left join main_table m on 
s.id = m.id where s.SOMECONDITION) )

我认为如果子表中有更多行满足SOMECONDITION,那么您的解决方案将不起作用。@Sam。我不同意你的评论。这应该与两个表之间的不同计数相匹配。检查我在回答中给出的示例,看看您的解决方案是否适用于此。@Sam。我看不出它是如何适用的。空值永远不会与IN条件匹配,并且此答案不使用左联接。我认为如果sub_表中有更多满足SOMECONDITION的行,则您的解决方案将不起作用。@Sam。我不同意你的评论。这应该与两个表之间的不同计数相匹配。检查我在回答中给出的示例,看看您的解决方案是否适用于此。@Sam。我看不出它是如何适用的。NULL值永远不会与IN条件匹配,并且此答案不使用左连接。