MySQL限制&在一起工作

时间:2017-11-15 17:16:35

标签: mysql inner-join mysql-workbench

我有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,而不是整个表格

2 个答案:

答案 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;