2015-02-05 56 views
0

所以我有這個問題,我必須顯示名稱或國家不構成組織'世衛組織'在表ismember的一部分。這是我想出的SQL顯示的國家不構成查詢的一部分 - mysql

SELECT DISTINCT ismember.country, country.name 
FROM ismember LEFT JOIN country ON ismember.country = country.code 
WHERE ismember.organization NOT IN (
    SELECT DISTINCT ismember.organization 
    FROM ismember 
    WHERE ismember.organization = 'WHO' 
) 
GROUP BY organization 
HAVING COUNT(organization) > 1 ; 

它的工作原理,它確實返回了不屬於'WHO'的國家。我的問題是這種方法排除了不屬於任何組織的國家。 I.E它排除那些在ismember表中沒有條目的國家。

任何想法如何解決這個問題

+0

你試過了一個OUTER連接嗎? – PaulProgrammer 2015-02-05 21:03:02

回答

1

爲什麼不只是這樣?

SELECT code, name FROM country WHERE code NOT IN (
    SELECT country FROM ismember WHERE organization = 'WHO' 
) 

應該做同樣的事情。 :)解決這個

+0

對,這樣做不會濫用「GROUP BY」。 – 2015-02-05 21:04:29

0

一種方法是簡單地聚集和having條款:

SELECT im.country, c.name 
FROM ismember im LEFT JOIN 
    country c 
    ON im.country = c.code 
GROUP BY m.country, c.name 
HAVING SUM(im.organization = 'WHO') = 0; 
0

這是沒有答案,但解釋你的查詢做什麼:

  1. 子查詢

    SELECT DISTINCT ismember.organization FROM ismember WHERE ismember.organization ='WHO'

對於組織爲「WHO」的表中的每個記錄,然後將所有'WHO'減少爲'WHO',這將得到字符串'WHO'。

  • NOT IN
  • 因此WHERE ismember.organization NOT IN (subquery)相同WHERE ismember.organization <> 'WHO'

  • LEFT JOIN
  • 您外左加入表國家。這意味着如果ismember包含一個不在國家/地區表中的國家,您仍然可以獲得該記錄。但爲什麼一個國家不在國家桌面?這似乎沒有道理。你可能會得到像123, NULL這樣的記錄,這意味着國家代碼123不是有效的國家,但是什麼?

  • GROUP BY
  • 您組由組織。所以你得到每個組織一個結果行。你不是說你想要列出國家嗎?

  • 聚合
  • 然後選擇ismember.country和每個組織country.name。由於您沒有指定像MAX(ismember.country)或MIN(country.name)這樣的所需聚合,您會得到一個隨機匹配。因此,如果在國家1,2和3有一個組織「ABC」,那麼你會隨機選擇其中的一個。

  • HAVING
  • HAVING COUNT(organization)是大約相同HAVING COUNT(*),即每組織國家的計數。準確地說:所有非空的組織都是一樣的(對於null,第一個表達式爲0,第二個爲國家/地區)。您希望該國家/地區的組織數量大於1.因此,您只能刪除只有一名成員的組織。

  • DISTINCT
  • 如果「ABC」隨機國家代碼爲1和隨機國名是「意大利」(它們不具有屬於一起兩者都是組織的獨立隨機選擇),同一對恰好是組織'DEF'的選擇,然後你將其中一個刪除,因此你得到1,'意大利'只有一次。

  • 驚喜
  • 我很驚訝你說這查詢的工作與未成年人的缺陷。對不起,我覺得這很難相信。