关于自联接的SQL查询

时间:2015-02-11 21:48:54

标签: mysql sql self-join

给定一个表格,世界有3个列:国家,大陆,人口如何获得显示每个人口最多的国家的输出?

这是我的代码:

select tb1.country, tb1.population from world tb1 join world tb2
ON tb1.continent=tb2.continent
Where tb1.population>tb2.population;

我的输出只返回1个来自1洲的国家。

3 个答案:

答案 0 :(得分:1)

之前我使用过这种方法似乎运作良好

SELECT a.country, a.population
FROM world a
WHERE NOT EXISTS (
    SELECT 1 FROM world b
    WHERE b.continent = a.continent
    AND b.population > a.population
)

SQL Fiddle

请耐心等待,SQL Fiddle今天看起来真的很慢


详细说明,子查询充当外部查询的过滤器,从而消除了存在人口较多的国家/地区的任何行(通过NOT EXISTS)。

这也回归了人口最多的国家。如果每个大陆只需要一个国家/地区,则需要进一步消除数据。

答案 1 :(得分:0)

答案如下:

select w1.country, w1.population from world w1,
(select max(w2.population) as p from world w2 group by w2.continental) T
where w1.population = T.p

答案 2 :(得分:0)

由于MySQL没有分析功能,您可以使用GROUP_CONCAT伪造它:

SELECT
  Continent,
  SUBSTRING_INDEX( CONCAT( GROUP_CONCAT(Country ORDER BY Population DESC), '|'), '|', 1) AS Country,
  SUBSTRING_INDEX( CONCAT( GROUP_CONCAT(Population ORDER BY Population DESC), ','), ',', 1) AS Population
FROM Populations
GROUP BY Continent;

或者您也可以使用:

SELECT
  p.Continent,
  p.Country,
  p.Population
FROM Populations p
     INNER JOIN
     (
       SELECT Continent,
              MAX( Population ) AS max_pop
       FROM Populations
       GROUP BY Continent
     ) m
     ON (   p.continent  = m.continent
        AND p.population = m.max_pop )
GROUP BY Continent;

或者:

SELECT
  p.Continent,
  p.Country,
  p.Population
FROM Populations p
WHERE p.population =
       (
         SELECT MAX( Population )
         FROM   Populations m
         WHERE  p.continent = m.continent
       );

SQLFIDDLE