我想编写一个返回数据的查询,当且仅当它具有子查询将返回的所有ids
时
我尝试过的事情:
SELECT * FROM main_table WHERE id IN ( SELECT id FROM sub_table WHERE SOMECODITION)
但是一旦在子查询中找到至少一个我不想要的匹配行,它就会返回。
主要是我想检查main_table
是否包含ids
返回的所有sub_table
编辑:
SOMECONDITION
与主查询
答案 0 :(得分:3)
您也可以使用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
等于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
返回一些内容。