2

SQLZooの問題に興味をそそられました。これは「グループあたり最大の問題」です。エンジンがどのように作動しているかを知りたいのですが。

bbcというテーブルには、各国の名前、地域、人口が含まれています。

bbc(名前、地域、人口)

与えられたタスクは、各地域で最も人口の多い国を選択し、その名前、地域、人口を表示することです。

提供されるソリューションは次のとおりです。

SELECT region, name, population FROM bbc x
  WHERE population >= ALL
    (SELECT population FROM bbc y
        WHERE y.region=x.region
          AND population>0)

1.主な質問。私はこれを少しマインドツイスターだと思っています。エンジンがこれをどのように処理するかを理解したいと思います。最初は、ある種の相互依存関係があるように見えるからです(xはyに依存し、yはxに依存します)。エンジンは、最終的な選択を生成するために、ある種の再帰に従いますか?または、xまたはyのいずれかが実際に修正されるなど、何かが足りませんか?

2.二次的な質問。奇妙なことに、括弧から「AND人口> 0」を引き出して、それを下部にそのままにしておくと、8つの結果から1つの地域(ヨーロッパ/ロシア)が欠落します。なんで?わかりません。

実際、ワールドデータベース(Sakilaと同じページのmySQL Webサイトから入手可能)でクエリを実行すると、動作が異なります。括弧から人口が0より大きい場合、6つのリージョンが取得されます。「SELECTcontinentFROMcountry GROUP BY continent」は、7つの大陸を示し、そのうちの1つは南極大陸であり、5つの「国」を含み、すべて人口が0であるため、このデータベースでは6が正しい数値です。

ですから、それは正しいようです。

SELECT continent, `name`, population FROM country X
WHERE population >= ALL 
(SELECT population FROM country Y
WHERE Y.`Continent` = X.`Continent`)
AND population>0

一方、SQLZooのように「population> 0」を括弧に戻すと、ゼロのある5か国(「南極に属する国」)も取得します。x.populationとy.populationのどちらを指定しても、ゼロになります。

continent      name                                          population  
-------------  --------------------------------------------  ------------
Antarctica     Antarctica                                               0
Antarctica     French Southern territories                              0
Oceania        Australia                                         18886000
South America  Brazil                                           170115000
Antarctica     Bouvet Island                                            0
Asia           China                                           1277558000
Antarctica     Heard Island and McDonald Islands                        0
Africa         Nigeria                                          111506000
Europe         Russian Federation                               146934000
Antarctica     South Georgia and the South Sandwich Islands             0
North America  United States                                    278357000

これらの質問に関する洞察を非常に探しています!

皆様のご多幸をお祈り申し上げます。

:)

ノート:

  1. 参考までに、問題はこのページの番号3aです:http: //old.sqlzoo.net/1a.htm?answer = 1

  2. 同じクエリの「グループあたりの最大数」の問題に言及しているスレッド: MySQLワールドデータベースサブクエリを回避しようとしています

  3. ワールドデータベースはここから入手できます:http://dev.mysql.com/doc/index-other.html

4

1 に答える 1

1
  1. 主な質問。私はこれを少しマインドツイスターだと思っています。エンジンがこれをどのように処理するかを理解したいと思います。最初は、ある種の相互依存関係があるように見えるからです(xはyに依存し、yはxに依存します)。エンジンは、最終的な選択を生成するために、ある種の再帰に従いますか?または、xまたはyのいずれかが実際に修正されるなど、何かが足りませんか?

これは再帰ではありません。MySQLドキュメントからこれを参照してください。問題に対する彼らの解決策はこれと同等です

SELECT region, name, population FROM bbc x
  WHERE population = 
    (SELECT max(population) FROM bbc y
        WHERE y.region=x.region
          )
  1. 二次質問。奇妙なことに、括弧から「AND人口> 0」を引き出して、それを下部にそのままにしておくと、8つの結果から1つの地域(ヨーロッパ/ロシア)が欠落します。なんで?わかりません。

わずかな変更(上記のypercubeで提案されているように)は機能します

SELECT region, name, population FROM bbc x
  WHERE population >= ALL
    (SELECT population FROM bbc y
        WHERE y.region=x.region
          AND population IS NOT NULL)

このクエリ

SELECT region, name, population FROM bbc x
  WHERE population is null

行を返します。なぜ人口がnull許容である必要があるのか​​わかりませんが、残りの部分をよく調べていませんでした。それ以外の場合、クエリは>0

また、これはグループあたりの最大数とは異なります。その問題では、上位のアイテムだけでなく、上位のN個のアイテムを見つけようとします。

于 2012-08-13T00:15:47.633 に答える