[英]Only return if main query has all the rows that subquery returns
我想编写一个查询,当且仅当它具有子查询将返回的所有ids
,该查询才返回数据
我尝试过的
SELECT * FROM main_table WHERE id IN ( SELECT id FROM sub_table WHERE SOMECODITION)
但一旦它在子查询中找到至少一个我不想要的匹配行,它就会返回。
主要是我想能够检查main_table
拥有所有的ids
是sub_table
的回报
编辑:
SOMECONDITION
与主查询无关
您也可以使用left join
来实现。 例如像,让我们举一个小例子main_table
具有IDS 1,2,3
和sub_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(sid)
等于count(mid)
,才可以使用count
来获取结果,因为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) )
这在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);
在这种情况下,您需要一个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
,从所有ID的sub_table
必须被发现main_table
为了从返回的东西main_table
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.