我有一个'users'
表:
user_id | prov_platform | first_name | last_name
--------|-----------------|--------------|-------------------
1 | Facebook | Joe | Bloggs
2 | Facebook | Sue | Barker
3 | | John | Doe
4 | Twitter | John | Terry
5 | Google | Angelina | Jolie
我最初想返回用户表中所有不同社交平台类型的列表,每个类型旁边都有计数 - 所以我想出了这个:
SELECT
IFNULL(prov_platform, 'Other') AS prov_platform,
COUNT(*) AS platform_total
FROM users
GROUP BY prov_platform
ORDER BY platform_total DESC
结果是这样的:
prov_platform | platform_total
---------------|-----------------
Facebook | 2
Twitter | 1
Google | 1
Other | 1
但我现在想向此查询添加另外几个字段; “allround_total”和“百分比”。因此,上面的记录集将变为:
prov_platform | platform_total | allround_total | percentage
---------------|----------------|----------------|---------------
Facebook | 2 | 5 | 40%
Twitter | 1 | 5 | 20%
Google | 1 | 5 | 20%
Other | 1 | 5 | 20%
这是我在陷入困惑之前所得到的:
SELECT
u.prov_platform,
COUNT(*) AS platform_total,
allround_total,
allround_total/platform_total*100 AS percentage
FROM
users AS u
INNER JOIN (
SELECT COUNT(*) AS allround_total FROM users
) AS allround_total
GROUP BY
prov_platform
ORDER BY
platform_total DESC
这会返回“allround_total”字段,该字段可以工作,但不知道它的性能如何。我无法锻炼的是如何让百分比正常工作。目前,上述查询返回错误:
Unknown column 'platform_total' in 'field list'
我想我已经很接近了,我只需要一个非常感谢的插入。
最佳答案
您不能在定义的同一级别中使用列别名。我还认为您已经计算了向后的百分比。
SELECT u.prov_platform, COUNT(*) AS platform_total,
const.allround_total,
100*count(*)/const.allround_total AS percentage
FROM users u cross join
(SELECT COUNT(*) as allround_total FROM users
) const
GROUP BY prov_platform
ORDER BY platform_total DESC;
我将连接
从内部连接
更改为交叉连接
。尽管 MySQL 允许所有连接都缺少 on
子句,但我发现看到没有 on
的 inner join
会令人不安。同样,我将表别名的名称更改为与列别名不同的名称,以使查询更易于阅读。
关于mysql - 列出用户类型及其数量和百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18674135/