gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:06:02 24 4
gpt4 key购买 nike

首先,我为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com