2016-07-07 5 views
0

私はユーザーが持っているポイント(お金)に基づいてリーダーボードを構築しようとしています。ポイントは複数のテーブルに保存され、一部のユーザーは特定のテーブルにポイントを持たない場合があります。MySQL複数のテーブルの複数の行の合計を取得し、合計を降順で並べ替えるにはどうすればよいですか?

Table: account 
-------------------------- 
| uid | name | locker | 
|-----|---------|--------| 
| 1 | Bob  | 15  | 
| 2 | Dave | 2  | 
| 3 | Jim  | 5  | 
-------------------------- 

Table: container 
------------------------ 
| account_uid | money | 
|-------------|--------| 
| 1   | 4  | 
| 3   | 1  | 
| 3   | 2  | 
| 3   | 4  | 
------------------------ 

Table: vehicle 
------------------------ 
| account_uid | money | 
|-------------|--------| 
| 2   | 2  | 
| 2   | 1  | 
| 3   | 2  | 
------------------------ 

私は、その結果の出力リレーを見たいのですが -

Bob 19 
Jim 14 
Dave 5 

いくつかのテーブルには、いくつかの人々のためのポイントを持っていませんのでご注意を。

このコードは私のためには機能しませんでした。それは何とかポイントを複製したようです。

SELECT 
    act.name, 
    act.uid, 
    SUM(COALESCE(act.locker,0) + COALESCE(con.money,0) + COALESCE(veh.money,0)) AS total 
FROM account as act 
    LEFT JOIN container as con 
    ON act.uid = con.account_uid 
    LEFT JOIN vehicle as veh 
    ON act.uid = veh.account_uid 
Group By act.name 
ORDER BY total DESC 
+0

ユーザーは、より一般的に二つの容器または媒体、またはいずれかを持っている場合、私は唯一のダブルポイントを期待する(ポイントの合計)X X(コンテナ内の行をマッチング)(車両内の行に一致する) –

+0

申し訳ありません!それを反映するようにテーブルを更新しました。私は最初の投稿にそれを追加するのを忘れていました。 – Damien

答えて

1

合計を1つずつ計算して1つに結合する方法はありますか?

select account.uid, account.name, sum(tot.Money) as TotalMoney from 
(
    (select uid, sum(Money) as Money from container 
    group by uid) 
    union all 
    (select uid, sum(Money) as Money from vehicle 
    group by uid) 
) tot 
inner join account on 
tot.uid = account.uid 
group by account.uid 
関連する問題