2013-12-07 4 views
0

При выполнении следующей команды mysql представляется, что коррелированный подзапрос возвращает несколько строк.Почему коррелированные подзапросы, которые используют MAX, возвращают несколько строк?

Вопрос 1. Почему MAX может возвращать несколько строк?
Вопрос 2. Как можно использовать оператор '=' для сопоставления нескольких строк?

SELECT Continent, Name, Population 
FROM Country c 
WHERE Population = (SELECT MAX(Population) 
        FROM Country c2 
        WHERE c.Continent=c2.Continent AND Population > 0); 


+---------------+--------------------+------------+ 
| continent  | name    | population | 
+---------------+--------------------+------------+ 
| Oceania  | Australia   | 18886000 | 
| South America | Brazil    | 170115000 | 
| Asia   | China    | 1277558000 | 
| Africa  | Nigeria   | 111506000 | 
| Europe  | Russian Federation | 146934000 | 
| North America | United States  | 278357000 | 
+---------------+--------------------+------------+ 
6 rows in set (0.22 sec) 
+0

На самом деле она возвращает наибольшее население для каждого континента. вы ожидаете вернуть континент с самым высоким уровнем кулинарии? –

+0

Я ожидаю, что он вернет население одной страны с самой высокой численностью населения. – TokyoMike

ответ

1

from your comment above, этот запрос является тем, который вы ищете. Это обрабатывает дубликаты.

SELECT Continent, Name, Population 
FROM Country c 
WHERE Population = (SELECT MAX(Population) FROM Country) 

Другой запрос, не обрабатывает дублировать

SELECT Continent, Name, Population 
FROM Country c 
ORDER BY Population DESC 
LIMIT 1 
+0

Позвольте мне перефразировать. Я не понимаю, почему мой запрос способен вернуть самую высокую совокупность каждого континента. Разве макс не возвращает только один? – TokyoMike

+1

@TokyoMike, потому что он коррелирован друг с другом. что означает, что вы получаете наибольшее значение для каждого континента из-за условия «... WHERE c.Continent = c2.Continent' –

+0

@ 今 草 顿 웃 Если он читает WHERE c.Continent IN (« Океания »,« Северная Америка »,), то MAX вернет только одно значение. Почему этот случай отличается? – TokyoMike

1

Что происходит в том, что эта часть:

WHERE c.Continent=c2.Continent AND Population > 0); 

Заставляет внешний запрос возвращать каждый континент в таблице страны и страну с наивысшим населением (с помощью MAX (совокупность), которую вы выполняете в запросе INNER).

= работает в этом случае, потому что подзапрос возвращает только одну строку для каждого континента, но в итоге вы все равно получите результаты для каждого континента, а не страны с максимальным населением в целом.

Это то же самое, как делают:

SELECT Continent, Name, Population 
FROM Country c 
WHERE c.Continent = 'Oceania' 
    AND Population = (SELECT MAX(Population) 
        FROM Country c2 
        WHERE c2.Continent = 'Oceania' AND Population > 0); 

Но так как вы не ограничивают Континенты одной конкретной, он делает то же самое для каждого континента в таблице.

Если вы хотите, чтобы вернуться только страну с населением MAX вы можете сделать:

SELECT Continent, Name, Population 
FROM Country c 
ORDER BY population DESC 
LIMIT 1; 
+0

Если бы я использовал IN вместо =, это имело бы смысл. Фактически, использование IN возвращает те же результаты, что и =. Я просто не понимаю, почему они это делают. – TokyoMike

+1

Конечно, вы бы это сделали. То, что заставляет вас получить несколько результатов, - это корреляция с внешним запросом. Вы сообщаете внутреннему запросу, что вы хотите, чтобы максимальная совокупность для континента, которую вы видите во внешнем запросе. делать в or = - то же самое, потому что вы получаете только одну строку для каждого континента. и это страна на этом континенте с макс (население) –

+0

Если бы мне пришлось переписать с ... Population = (111,222,333), произошла ошибка. Итак, в этом случае оператор = выполняется только несколько раз? – TokyoMike

Смежные вопросы