簡體   English   中英

一個針對三個表的MySQL查詢:A中有多少不在B或C中?

[英]A MySQL query addressing three tables: How many from A are not in B or C?

我在制定一個MySQL查詢來執行以下任務時遇到了一個問題,盡管我在這里看到了類似的查詢,但它們與這一查詢有很大的不同,可以讓我無意中調換它們。 這個問題很(很)容易說明。 我有三個表,“成員”,“ dog_shareoffered”和“ dog_sharewanted”。 成員可能想要出售或購買的商品有零個,一個或多個廣告,並且詳細信息以及放置廣告的成員的ID一起存儲在相應的提供或想要的表中。 列“ id”對於成員而言是唯一的,並且對於所有三個表都是相同的。 我要查詢的是詢問有多少個成員未在任一表中放置廣告。

我嘗試了幾種方法來問這個。 我能得到的最接近的查詢不會崩潰! (無論如何我都不是MySQL專家)。 根據我從其他示例中收集的內容,以下內容進行了匯總,但返回零行,我知道結果應大於零。

SELECT id 
  FROM members 
 WHERE id IN (SELECT id 
                FROM dog_sharewanted 
               WHERE id IS NULL) 
   AND id IN (SELECT id 
                FROM dog_shareoffered 
               WHERE id IS NULL)

與我所見過的“ JOIN”不同,該查詢看起來很容易理解,但我猜測也許我需要某種Join,但是在這種情況下會怎樣呢?

如果您在任何一個表中都不希望有廣告,那么您要查詢的是:

SELECT id
FROM members
WHERE id NOT IN ( any id from any other table )

要從其他表中選擇ID,請執行以下操作:

SELECT id
FROM <othertable>

因此:

SELECT id
FROM members
WHERE id NOT IN (SELECT id FROM dog_shareoffered)
 AND  id NOT IN (SELECT id FROM dog_sharewanted)

我添加了“ SELECT DISTINCT”,因為一個成員可能會投放許多廣告,但是只有一個ID。 我以前在上面的子查詢中有一個SELECT DISTINCT ,但是正如下面的注釋所述,這不是必需的。

如果要避免子查詢(可能會提高性能,取決於..),則可以使用一些LEFT JOIN:

SELECT members.id
FROM members
LEFT JOIN dog_shareoffered
 ON dog_shareoffered.id = members.id
LEFT JOIN dog_sharewanted
 ON dog_sharewanted.id = members.id
WHERE dog_shareoffered.id IS NULL
  AND dog_sharewanted.id IS NULL

工作原理:

它接受表members並將其連接到id列上的其他兩個表。 LEFT JOIN意味着,如果members表中存在一個成員,但我們要加入的表中存在該members (例如dog_shareoffered ),則對應的dog_shareoffered列中將為NULL

因此, WHERE條件挑選出在dog_shareoffereddog_sharewanted中都具有NULL ID的行,這意味着我們在其他兩個表中的members中沒有對應的ID的情況下找到了ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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