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

そして、私は元々、users テーブルにあるさまざまなソーシャル プラットフォーム タイプすべてのリストを、それぞれの横にカウントを付けて返したいと考えていたので、次のように考えました。

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」と「percentage」。したがって、上記のレコードセットは次のようになります。

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;

joinをからに変更しましinner joincross join。MySQL ではすべての結合でon句を省略できますが、inner joinwith noを見ると戸惑いonます。同様に、クエリを読みやすくするために、テーブル エイリアスの名前を列エイリアスとは異なる名前に変更しました。

于 2013-09-07T14:10:34.740 に答える