2012-02-20 76 views
2

我有一個問題來制定一個MySQL查詢來完成以下任務,儘管我已經看到類似的查詢在這裏討論,它們與這個完全不同,以斯諾克我試圖轉置它們。問題是(相當)簡單的狀態。我有三張桌子,'會員','dog_shareoffered'和'dog_sharewanted'。成員可能有零個或一個或多個廣告,用於他們想要出售或想要購買的東西,詳情存儲在相應的提供或需要的表格中,以及放置廣告的成員的ID。 'id'列對於成員是唯一的,並且對於所有三個表是共同的。我想要的查詢是詢問有多少成員沒有在任何一個表中放置廣告。針對三個表的MySQL查詢:A中有多少不在B或C中?

我已經嘗試了多種方式詢問此問題。我能得到的最接近的是一個不會崩潰的查詢! (我不是任何方式的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) 

這個查詢看起來令人愉快的簡單理解,不同的是「加入的」我見過,但我猜測,也許我需要某種形式的加入,但如何將看起來在這種情況下?

+0

我會強烈考慮將'dog_shareoffered'和'dog_sharewanted'表合併爲一個,並附加一個字段來表示「提供」與「共享」。 – 2012-02-20 01:19:18

+1

@OliCharlesworth你不知道這兩個表是否有相同的列和相同的FOREIGN KEY對其他表。 – 2012-02-20 01:29:00

+0

@BrankoDimitrijevic:你說得對,我不知道。所以我應該以「如果可能」來限定我以前的評論。 – 2012-02-20 01:29:32

回答

6

如果你想在要麼表中沒有廣告,則排序查詢您追求的是:

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表中存在,但不我們要加入到(例如dog_shareoffered)該表中,則相應的列dog_shareoffered將在他們NULL

因此,WHERE條件挑出行,其中有兩個dog_shareoffereddog_sharewanted一個NULL ID,這意味着我們的其他兩個表中發現IDS在members沒有相應的ID。

+0

是的,左連接的方法就在這裏。對於OP:一旦你學習了左連接,你會發現這正是他們的意圖。 – 2012-02-20 01:30:08

+2

在子查詢中不需要DISTINCT。 IN只會區分「0」和「大於0」(多於0的數量沒有差別)。 – 2012-02-20 01:34:29

相關問題