从最常见到最不常见的列对列进行排序,忽略重复

时间:2017-02-26 13:17:54

标签: mysql

我试图通过确定有多少人说出世界上最常见的语言列表,从世界桌面开始。

到目前为止,我有:

SELECT DISTINCT language, TRUNCATE((country.population * countrylanguage.percentage / 100), 0) AS People
FROM countrylanguage, country
WHERE code = countrycode
ORDER BY People DESC

它几乎给了我想要的东西,但语言不会正确加起来,例如英语每次作为一种语言被提及时多次出现。我知道我在某个地方弄错了,我无法弄清楚在哪里。

enter image description here

编辑:Saw pic是挪威语。左栏是语言,右边是说话的人数。

2 个答案:

答案 0 :(得分:2)

你可能打算在这里进行某种聚合。我猜你应该汇总每种语言的发言人数量,然后报告:

SELECT t1.language,
       TRUNCATE(SUM(t2.population * t1.percentage / 100), 0) AS people
FROM countrylanguage t1
INNER JOIN country t2
    ON t1.countrycode = t2.code
GROUP BY t1.language
ORDER BY people DESC

请注意,我已将隐式连接替换为使用INNER JOINON子句的显式连接。大多数人认为以这种方式编写带有连接的查询是合乎需要的,因为它可以更容易地看到发生了什么。

答案 1 :(得分:0)

您需要JOIN和聚合,并使用聚合函数:

SELECT cl.language,
       TRUNCATE(SUM(c.population * cl.percentage) / 100), 0) AS People
FROM countrylanguage cl JOIN
     country c
     ON c.code = cl.countrycode
GROUP BY cl.language
ORDER BY People DESC;

为此目的使用TRUNCATE()似乎很奇怪。您希望将People作为整数返回。更典型的函数是FLOOR()

SELECT cl.language,
       FLOOR(SUM(c.population * cl.percentage) / 100) AS People
FROM countrylanguage cl JOIN
     country c
     ON c.code = cl.countrycode
GROUP BY cl.language
ORDER BY People DESC;