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
これらの質問に関する洞察を非常に探しています!
皆様のご多幸をお祈り申し上げます。
:)
ノート:
参考までに、問題はこのページの番号3aです:http: //old.sqlzoo.net/1a.htm?answer = 1
同じクエリの「グループあたりの最大数」の問題に言及しているスレッド: MySQLワールドデータベースサブクエリを回避しようとしています
ワールドデータベースはここから入手できます:http://dev.mysql.com/doc/index-other.html