You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带最大值条件的3张表SQL JOIN查询:获取各国人口最多的城市

解决方案

方案1:窗口函数实现(推荐,支持MySQL 8.0+、PostgreSQL、SQL Server等主流新版本数据库)

通过RANK()窗口函数按国家分组对城市人口做降序排名,直接取每组排名第一的记录即可:

SELECT 
    country_name,
    most_populous_city_name,
    city_population
FROM (
    SELECT 
        co.name AS country_name,
        ci.name AS most_populous_city_name,
        ci.population AS city_population,
        -- 按国家分组,组内按城市人口降序排名
        RANK() OVER (PARTITION BY co.id ORDER BY ci.population DESC) AS pop_rank
    FROM country co
    INNER JOIN region r ON co.id = r.country_id
    INNER JOIN city ci ON r.id = ci.region_id
    WHERE ci.population > 100000 -- 过滤人口小于等于10万的城市
) AS ranked_cities
WHERE pop_rank = 1;
  • 如果同一个国家有多个城市人口并列最高,RANK()会返回所有并列第一的城市;如果只需要返回任意一个,把RANK()替换为ROW_NUMBER()即可。
  • 你提供的示例数据运行该SQL后输出结果为:
    country_namemost_populous_city_namecity_population
    印度德里10000000
    美国拉斯维加斯624000

方案2:兼容老版本数据库实现(适用于MySQL 5.x等不支持窗口函数的场景)

先子查询查出每个国家符合条件的最高人口,再关联原表拿到对应的城市信息:

SELECT 
    co.name AS country_name,
    ci.name AS most_populous_city_name,
    max_pop.max_population AS city_population
FROM country co
INNER JOIN region r ON co.id = r.country_id
INNER JOIN city ci ON r.id = ci.region_id
INNER JOIN (
    -- 查询每个国家符合条件的最高人口数
    SELECT co.id AS country_id, MAX(ci.population) AS max_population
    FROM country co
    INNER JOIN region r ON co.id = r.country_id
    INNER JOIN city ci ON r.id = ci.region_id
    WHERE ci.population > 100000
    GROUP BY co.id
) AS max_pop ON co.id = max_pop.country_id AND ci.population = max_pop.max_population
WHERE ci.population > 100000;

内容的提问来源于stack exchange,提问作者Foxman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:06:04