簡體   English   中英

僅當主查詢具有子查詢返回的所有行時才返回

[英]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擁有所有的idssub_table的回報

編輯:

SOMECONDITION與主查詢無關

您也可以使用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(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM