我有3张桌子,我正在努力获得10种最常用的语言和使用这种语言的国家/地区。我的表是:
City: Name|Population|CountryCode
Country: Name|Code
CoutryLanguage: Language|CountryCode
要获得前10种语言,我会使用每个城市的人口并使用国家/地区语言加入:
SELECT cl.language
FROM City ci INNER JOIN CountryLanguage cl ON ci.CountryCode = cl.CountryCode
GROUP BY cl.Language
order by sum(ci.population) desc limit 10
我的下一个逻辑是用语言加入国家/地区,语言在我新创建的表格中:
select co.Name, cl.Language
from Country co Inner join CountryLanguage cl on co.Code = cl.CountryCode
where cl.Language in (SELECT cl.language
FROM City ci INNER JOIN CountryLanguage cl ON ci.CountryCode = cl.CountryCode
GROUP BY cl.Language
order by sum(ci.population) desc limit 10)
这给了我一个奇怪的错误,我可以在没有LIMIT 10
的情况下使用它,但只列出所有国家和所有语言。有没有办法来解决这个问题??我看到几个关于这个的问题,但没有一个是非常明确的。你介意给我解释这个错误吗?我无法升级我的sql版本。提前致谢
我将语言数量限制为10,而不是整个表格
答案 0 :(得分:1)
请试试这个,抱歉所有后退和前进但我没有安装mysql,只是在这里写SQL ....
select co.Name, cl.Language
from Country co
Inner join CountryLanguage cl on co.Code = cl.CountryCode
inner join (
SELECT language from (
SELECT DISTINCT cl.language
FROM City ci INNER JOIN CountryLanguage cl ON ci.CountryCode = cl.CountryCode
GROUP BY cl.Language
order by sum(ci.population) desc
) as lng_tbl
limit 10
) aux_tbl
on aux_tbl.Language = cl.Language
查看子查询,因为它是在运行时/内存中创建的表,在这种情况下,您将获得下表:
SELECT language from (
SELECT DISTINCT cl.language
FROM City ci
INNER JOIN CountryLanguage cl
ON ci.CountryCode = cl.CountryCode
GROUP BY cl.Language
order by sum(ci.population) desc
) as lng_tbl
limit 10
>>> | language |
>>> | English |
>>> | Portuguese |
>>> | ... |
之后只需将其包装在()中并为其命名aux_tbl
,然后就可以在连接和普通表中使用它。作为练习,尽量摆脱外在
从()选择语言为lng_tbl。
答案 1 :(得分:0)
只需用这样的临时表替换子查询:
CREATE TEMPORARY TABLE tmp_lang (key(Language)) SELECT cl.language
FROM City ci INNER JOIN CountryLanguage cl ON
ci.CountryCode = cl.CountryCode
GROUP BY cl.Language
order by sum(ci.population) desc limit 10;
select co.Name, cl.Language
from Country co Inner join CountryLanguage cl on co.Code = cl.CountryCode
join
tmp_lang tl on c1.Language = tl.Language;