2014-10-27 55 views
0

首先,我正在使用mySQL的世界數據庫:http://dev.mysql.com/doc/world-setup/en/index.html如何混合並改進這個SQL語句?

我試圖建立一個句子,返回來自每個大陸最不居住的國家,如果人口相同,則顯示每個大洲的所有國家。

用下面的句子,我設法得到每個大陸中最少居住的國家的人口,但只有其中一個顯示,並且國家顯示不正確。

SELECT 
CASE 
    WHEN Continent="Europe" THEN "Europe" 
    WHEN Continent="Asia" THEN "Asia" 
    WHEN Continent="North America" THEN "North America" 
    WHEN Continent="South America" THEN "South America" 
    WHEN Continent="Africa" THEN "Africa" 
    WHEN Continent="Oceania" THEN "Oceania" 
    ELSE "Antarctica" 
END 
    AS Area, 
Name, 
    CONCAT(MIN(Population),"hb") AS "N habitantes"  
FROM Country 
GROUP BY Area; 

給出了這樣的結果

'Africa'  , 'Angola'  , '0hb' 
'Antarctica' , 'Antarctica' , '0hb' 
'Asia'   , 'Afghanistan' , '286000hb' 
'Europe'  , 'Albania'  , '1000hb' 
'North America', 'Aruba'   , '7000hb' 
'Oceania'  , 'American Samoa', '0hb' 
'South America', 'Argentina'  , '2000hb' 

好了,代碼是很愚蠢的,我想必須有一種方法來指示更好地爲每個大陸上的查詢必須返回至少居住的國家。我想知道它是否存在,因爲只有7個大陸可以完成,但是如果它們是1000000 ...

有了這些句子,我將能夠返回該大陸上最少居住的國家我表示,例如:

SELECT Name,Population FROM Country WHERE Population= 
(SELECT MIN(Population) FROM Country WHERE Continent="Antarctica"); 

返回:

'南極洲', '0'

'法國南方的領土', '0'

「布維島 ' '0'

'赫德島和麥當勞羣島', '0'

'英屬印度洋領地', '0'

'南喬治亞島和南桑威奇羣島',' 0'

‘美國本土外小島嶼’,‘0’

我認爲必須有這兩個句子混合的一種方法,它返回類似於以前的結果,每個大洲,所以返回結果是什麼我一開始就在講。我的意思是,如果在世界上唯一的大陸,其中南極洲和南美洲應該將其添加到先前的結果:

「福克蘭羣島」,「2000」

「諾福克島」,「2000」

「紐埃」,「2000」

「托克勞」,「2000」

我知道我可以使用UNION使得類似於第二個每個大洲的一句話,但再次,這是可行的,只是因爲有隻有7大洲。

有什麼想法我錯過了什麼?謝謝你的幫助。

回答

-1

你可以通過這樣的使用羣體:

SELECT Name,Population FROM Country WHERE Population= 
(SELECT MIN(Population) FROM Country GROUP BY Continent); 
+0

謝謝您的回答序列號,但除非我已經理解錯了,它不起作用。首先,子查詢返回多於一行,所以它不能通過執行,我想你想把最後一行)放在國家之後,這樣它就可以工作,但是這個世界上所有國家中人口最少的國家並不在每個大陸,只是顯示每個大洲的一個國家。 – user2638180 2014-10-27 12:17:20

1
SELECT x.continent 
     , x.code 
     , x.name 
     , x.population 
    FROM country x 
    JOIN 
     (SELECT continent 
      , MIN(population) min_population 
      FROM country 
     GROUP 
      BY continent 
    ) y 
    ON y.continent = x.continent 
    AND y.min_population = x.population; 

輸出:

+---------------+------+----------------------------------------------+------------+ 
| continent  | code | name           | population | 
+---------------+------+----------------------------------------------+------------+ 
| Antarctica | ATA | Antarctica         |   0 | 
| Antarctica | ATF | French Southern territories     |   0 | 
| Antarctica | BVT | Bouvet Island        |   0 | 
| South America | FLK | Falkland Islands        |  2000 | 
| Antarctica | HMD | Heard Island and McDonald Islands   |   0 | 
| Africa  | IOT | British Indian Ocean Territory    |   0 | 
| Asia   | MDV | Maldives          |  286000 | 
| Antarctica | SGS | South Georgia and the South Sandwich Islands |   0 | 
| North America | SPM | Saint Pierre and Miquelon     |  7000 | 
| Oceania  | UMI | United States Minor Outlying Islands   |   0 | 
| Europe  | VAT | Holy See (Vatican City State)    |  1000 | 
+---------------+------+----------------------------------------------+------------+ 
3

要獲得每個大洲的人口最少的國家的名字,你需要確定這些國家。事情是這樣的: -

SELECT Continent, MIN(Population) 
FROM Country 
GROUP BY Continent 

不好的一面是它不返回國名,你不能合法剛纔添加的國家名稱查詢(MySQL不會出錯,但結果是不確定的)。

因此,你可以使用上面作爲一個子查詢,並加入它對陣表,無論在大陸的名稱和人口

SELECT b.Continent, b.Name, b.Population 
FROM 
(
    SELECT Continent, MIN(Population) AS Population 
    FROM Country 
    GROUP BY Continent 
) a 
INNER JOIN Country b 
ON a.Continent = b.Continent 
AND a.Population = b.Population 

一面是,如果一個以上的國家有在一個大陸同樣的人口,結果將是奇怪的。

另一種選擇是使用GROUP_CONCAT把所有的名字連在一起,在安裝順序,那麼就使用SUBSTRING_INDEX搶第一個: -

SELECT Continent, SUBSTRING_INDEX(GROUP_CONCAT(Name ORDER BY Population), ',', 1), SUBSTRING_INDEX(GROUP_CONCAT(Population ORDER BY Population), ',', 1) 
FROM Country 
GROUP BY Continent 
這種方法的

一面是,如果一個國家的名稱中包含用作分隔符的字符,結果可能很奇怪(默認是逗號)。

也有可能使用用戶變量來人口有序的大陸內的序列號添加到國家,然後只要抓住那些擁有1