mysql - 如何混合和改进这个 SQL 语句?

标签 mysql sql

首先,我为 mySQL 使用世界数据库:http://dev.mysql.com/doc/world-setup/en/index.html .

我正在尝试构建一个句子,返回每个大陆中人口最少的国家,如果人口相同,则显示每个大陆的所有国家/地区。

通过下面这句话,我设法得到了每个大陆上一个人口最少的国家的人口,但只有其中一个显示,而且国家显示不正确。

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 个大洲。

知道我错过了什么吗?感谢您的帮助。

最佳答案

要获取每个大陆上人口最少的国家/地区的名称,您需要确定这些国家/地区。像这样:-

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 的国家。

关于mysql - 如何混合和改进这个 SQL 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26587259/

相关文章:

mysql - 对数据库进行结构更改后更新 MySQL 存储过程

mysql - 如何在MySql中返回具有相同列值的行

SQL 在 concat 语句之间打印一个空格

mysql - SQL 查询排除出现在其他行中的记录?

php - 打印多维数组 PHP

mysql - 使用父 ID 和子 ID 加入

javascript - D3js 图表未显示

mysql - 多个表的 SQL 结构

php - Kohana SQL 准备语句安全

sql - 当列为varchar时在mysql中查找最大值