[英]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.