仅当主查询具有子查询返回的所有行时才返回

时间:2018-03-15 11:36:19

标签: mysql sql

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

我尝试过的事情:

SELECT * FROM main_table WHERE id IN ( SELECT id FROM sub_table WHERE SOMECODITION)

但是一旦在子查询中找到至少一个我不想要的匹配行,它就会返回。

主要是我想检查main_table是否包含ids返回的所有sub_table

编辑:

SOMECONDITION与主查询

无关

3 个答案:

答案 0 :(得分:3)

您也可以使用left join来实现这一目标。例如,让我们举一个小例子main_table有ids 1,2,3sub_table有ids 1,2,5,6(匹配SOMECONDITION)所以以下查询,

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。 仅当count等于count(sid)时,您才可以使用count(mid)来获取结果,因为count不考虑null值。所以你的查询就会变成。

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) )

答案 1 :(得分:1)

这在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);

答案 2 :(得分:0)

在这种情况下,您需要inner join

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

我认为SOMECODITION仅包含针对sub_table的条件。使用SOMECODITION,保证sub_table的结果必须符合条件,而INNER JOIN必须在sub_table中找到main_table的所有ID,以便从main_table返回一些内容。