2016-07-07 12 views
0

Ich versuche eine Rangliste basierend auf den Punkten (Geld) zu erstellen, die ein Benutzer hat. Die Punkte werden in mehreren Tabellen gespeichert und einige Benutzer haben möglicherweise keine Punkte in einer bestimmten Tabelle.MySQL Wie bekomme ich die Summe mehrerer Zeilen aus mehreren Tabellen und ordne die Ergebnisse dann nach Gesamt absteigend?

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  | 
------------------------ 

Ich möchte die Ergebnisse ouput wie sehen -

Bob 19 
Jim 14 
Dave 5 

Beachten Sie, dass einige Tabellen haben keine Punkte für einige Menschen.

Dieser Code hat nicht für mich funktioniert. Es scheint die Punkte irgendwie dupliziert zu haben.

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

Ich würde nur doppelte Punkte erwarten, wenn ein Benutzer entweder zwei Container oder Fahrzeuge oder allgemeinen (Summe der Punkte) X (passende Zeilen in Containern) X (passende Zeilen in Fahrzeug) –

+0

Leider hat! Ich habe die Tabellen aktualisiert, um das zu berücksichtigen. Ich habe vergessen, das im ersten Post hinzuzufügen. – Damien

Antwort

1

Wie wäre es, die Summen einzeln zu berechnen und dann zu einem zusammenzufassen?

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