2017-05-08 4 views
1

Ich habe 2 Tabellen (Beispiel):Max & AVG MYSQL INNER JOIN für 2 Tische

Benutzer:

ID company_ID 
1  7 
2  6 
3  7 

activity_rewards:

user_ID points activity_type_ID 
1   1   7 
1   2   7 
1   1   7 
1   1   8 
2   1   7 
2   1   7 
2   2   8 
2   1   7 
3   2   7 
3   1   7 
3   2   8 
3   1   8 

(Es gibt auch Tische für Unternehmen und activity_types, aber sie sollten hier nicht relevant sein)

Ich brauche eine MYSQL-Abfrage, die die Summe der Punkte f summiert oder jeder Benutzer WHERE alle Benutzer ein bestimmtes company_ID und für ein bestimmtes activity_type_ID und es wird die MAX und die AVG der Summe aller Benutzer Punkte

Ich habe zum Beispiel zurück:

SELECT SUM(activity_rewards.points) AS totalpoints, 
    MAX(activity_rewards.points) AS maxpoints, 
    AVG(activity_rewards.points) AS avgpoints 
FROM activity_rewards 
INNER JOIN users 
    ON activity_rewards.user_ID = users.ID 
WHERE ((users.company_ID = "7") && (activity_rewards.activity_type_ID LIKE '8')) 

In der Beispiel Abfrage nur 3 Ergebnisse sind beteiligt. Sie sind:

user_ID points activity_type_ID 
1   1   8 
3   2   8 
3   1   8 

I erhalten möchten:

  • Benutzer 1 hat 1 Punkt
  • Benutzer 3 hat 3 Punkte
  • Max 3 Durchschnitt 2

statt Ich bekomme Max ist 2 und der Durchschnitt ist 1,33

+0

Sie wollen die max und den Durchschnitt der von Benutzer-ID summierten Punkte dann. – Shadow

Antwort

2

Die Die Ergebnisse stimmen mit Ihrer Anfrage überein, Ihre Anfrage entspricht jedoch nicht Ihren Anforderungen.

Ihre Abfrage berechnet das Maximum und den Durchschnitt der Punkte in den relevanten Datensätzen. Aber Sie scheinen den Maximalwert und den Durchschnitt der durch die Benutzer-ID summierten Punkte zu haben.

Das bedeutet, dass Sie die Summe der Punkte pro Benutzer in einer Unterabfrage berechnen und dann den Höchstwert und den Durchschnitt in der äußeren Abfrage berechnen müssen.

SELECT SUM(sumpoints) as totalpoints, max(sumpoints) as maxpoints, avg(sumpoints) as avgpoints 
FROM 
    (SELECT users.ID, SUM(activity_rewards.points) AS sumpoints 
    FROM activity_rewards 
    INNER JOIN users ON activity_rewards.user_ID = users.ID 
    WHERE users.company_ID = 7 and activity_rewards.activity_type_ID = 8 
    GROUP BY users.ID) t 
+0

Danke, das hat funktioniert. Kannst du mir sagen, was das "t" am Ende bedeutet? – Barrowstorm

+0

Es ist ein Alias, ähnlich wie Totalpunkte, Maxpoints und Avgpoints (die Verwendung von 'as' ist optional). Jede abgeleitete Tabelle (Unterabfrage in der 'from'-Klausel) muss einen Alias ​​(einen Namen) haben. – Shadow

0

Machen Sie es wie folgt aus:

SELECT MAX(sum_points) max, AVG(sum_points) avg, SUM(sum_points) sum_all FROM (SELECT SUM(t2.points) sum_points FROM users t1 JOIN activity_rewards t2 ON (t1.ID = t2.user_ID) WHERE ((t1.company_ID = "7") AND (t2.activity_type_ID = '8')) GROUP by t1.ID) as summation