2

私は今SQLに苦労しています。

行 ID、名前、国、人口を含むテーブル都市を取得しました。

ID  |     name     |  country  | population 
1   | Shanghai     | CN        | 14608512
2   | Buenos Aires | AR        | 13076300
3   | Mumbai       | IN        | 12691836
4   | Karachi      | PK        | 11624219
5   | Beijing      | CN        |  7480601
6   | Wuhan        | CN        |  4184206
7   | Berlin       | DE        |  3426354
8   | Puyang       | CN        |  3590000

データベースには、人口が 15,000 人を超えるすべての都市の世界規模のデータが含まれています。現在、人口別に世界最大の都市を 50 取得しようとしています。

SELECT * FROM cities ORDER BY population DESC LIMIT 0,50

現在の問題は、中国で 12 都市、インドで 4 都市などを取得することです。しかし、国ごとに結果を制限する必要があるため、国ごとに 2 都市のみが返されます。

上記の例による結果:

ID  |     name     |  country  | population 
1   | Shanghai     | CN        | 14608512
2   | Buenos Aires | AR        | 13076300
3   | Mumbai       | IN        | 12691836
4   | Karachi      | PK        | 11624219
5   | Beijing      | CN        |  7480601
7   | Berlin       | DE        |  3426354

しかし、私が言ったように、私はこの種の操作に適した SQL クエリに苦労しています。GROUP BY ... HAVING とさまざまなサブセレクトを試しましたが、正しい結果セットを返すものはありませんでした。

4

1 に答える 1

1

これを試して:

select * from
    (select t.* from t_population t
    join
        (select  country,MAX(population) as population
         from    t_population
         group by country)a
    on  t.country=a.country
    and t.population=a.population
union all
    select t.* from t_population t
    join
        (select country,MAX(population) as population
         from   t_population t1
         where  population <> (select MAX(population) 
         from  t_population t2 where t1.country=t2.country)
         group  by country)b
    on t.country=b.country
    and t.population=b.population)c
order by  population desc


SQL フィドルのデモ

于 2012-08-23T12:52:26.887 に答える