0

我有一张'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”字段,该字段有效,但不知道它对性能的友好程度。我不能锻炼的是如何让百分比正常工作。目前,上述查询返回错误:

'字段列表'中的未知列'platform_total'

我想我已经接近了,我只需要一个非常感谢的推线。

4

1 回答 1

1

您不能在定义的同一级别中使用列别名。我还认为您可以向后计算百分比。

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;

我把joininner join改成cross join。虽然 MySQL 允许所有连接都缺少一个on子句,但我发现看到一个inner joinwith no令人不安on。同样,我将表别名的名称更改为与列别名不同,以使查询更易于阅读。

于 2013-09-07T14:10:34.740 回答