2017-07-02 2 views
0

Ich habe diese Tabelle in mysql:MYSQL - Summenwerte von letzten 10 Tage

| player1 | player2 | date | fs_1 | fs_2 | 
    Jack   Tom  2015-03-02  10   2 
    Mark  Riddley 2015-05-02  3   1 
    ... 

ich wissen muss, wie viele Asse (FS_1) Spieler 1 haben vor dem Spiel in date_g berichtet getan (10 Tage vor für Beispiel).

Das ist, was ich ohne Erfolg versucht:

OPTION 1

SELECT 
    players_atp.name_p AS 'PLAYER 1', 
    P.name_p AS 'PLAYER 2', 
    DATE(date_g) AS 'DATE', 
    result_g AS 'RESULT', 
    FS_1, 
    FS_2, 
    SUM(IF(date_sub(date_g, interval 10 day)< date_g, FS_1, 0)) AS 'last 10 days' 
FROM 
    stat_atp stat_atp 
     JOIN 
    backup3.players_atp ON ID1 = id_P 
     JOIN 
    backup3.players_atp P ON P.id_p = id2 
     JOIN 
    backup3.games_atp ON id1_g = id1 AND id2_g = id2 
     AND id_t_g = id_t 
     AND id_r_g = id_r 
WHERE 
    date_g > '2015-01-01' 
GROUP BY ID1; 

OPTION 2

SELECT 
    players_atp.name_p AS 'PLAYER 1', 
    P.name_p AS 'PLAYER 2', 
    DATE(date_g) AS 'DATE', 
    result_g AS 'RESULT', 
    FS_1, 
    FS_2, 
    SUM(CASE WHEN date_g between date_g and date_sub(date_g, interval 10 day) then fs_1 else 0 end) AS 'last 10 days' 
FROM 
    stat_atp stat_atp 
     JOIN 
    backup3.players_atp ON ID1 = id_P 
     JOIN 
    backup3.players_atp P ON P.id_p = id2 
     JOIN 
    backup3.games_atp ON id1_g = id1 AND id2_g = id2 
     AND id_t_g = id_t 
     AND id_r_g = id_r 
WHERE 
    date_g > '2015-01-01' 
GROUP BY ID1; 

ich den Code bearbeitet haben, ist jetzt mehr leicht zu lesen und unter Stand.

SELECT 
    id1 AS 'PLAYER 1', 
    id2 AS 'PLAYER 2', 
    DATE(date_g) AS 'DATE', 
    result_g AS 'RESULT', 
    FS_1, 
    FS_2, 
    SUM(CASE 
     WHEN date_g BETWEEN date_g AND DATE_SUB(date_g, INTERVAL 10 DAY) THEN fs_1 
    END) AS 'last 20 days' FROM 
    stat_atp stat_atp 
     JOIN 
    backup3.games_atp ON id1_g = id1 AND id2_g = id2 
     AND id_t_g = id_t 
     AND id_r_g = id_r GROUP BY ID1; 

Vielen Dank im Voraus.

+1

Können Sie uns die anderen Tabellen geben? Es wäre verständlicher, vor allem, weil Sie eine Aggregation für Ihre Statistiken verwenden (GROUP BY). Sie sollten die Bedingung jedoch nicht im Projektionsteil Ihrer Abfrage verwenden (SELECT). Es ist besser geeignet im Einschränkungsteil (WHERE). –

+0

Hier gibt es Spielraum für weitere Normalisierung – Strawberry

+0

Ich habe den Code aktualisieren. Überprüfen Sie, ob es einfacher ist. –

Antwort

0

könnte man vielleicht helfen:

SELECT 
    id1, 
    SUM(fs_1) 
FROM 
    stat_atp 
WHERE 
    date_g <= DATE_SUB('2015-03-02', INTERVAL 1 DAY) AND date_g >= DATE_SUB('2015-03-02', INTERVAL 10 DAY) 
AND 
    id1='Jack' 
GROUP BY id1; 

dass RDBMS Denken Sie daran, werden verwendet, strenge Datensätzen zu erstellen, die zwischen jeweils anderen durch klare ids (Tasten, wenn man über SQL) verbunden sind. Es ist einfacher, die drei ersten Normalformen zu respektieren. Aus diesem Grund sollten Sie Schlüssel verwenden, um Ihre Übereinstimmung selbst zu identifizieren. Auf diese Weise können Sie Unterabfragen (Teilmengen) verwenden, um Ihr Ziel zu erreichen.

Denken Sie daran, dass SQL STRUCTURED ist. Es ist seine Kraft und Schwäche, weil Sie es nicht als Turing-Programmiersprache mit Schleifen und Bedingungen verwenden können. Aber in jeder Situation werden Sie die gleiche Struktur für eine Abfrage finden können. Sie können jedoch mit einem SQL-Abfrageergebnis mit einer anderen Sprache interagieren und Schleifen und Bedingungen für das Ergebnis selbst verwenden. Das liegt an dir.

Wie auch immer, können Sie über die MySQL GROUP BY-Klausel zu lesen, die von der ISO SQL Form unterscheidet: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

+0

Vielen Dank. Ich habe den Code mit Ihrer Implementierung bearbeitet und es funktioniert, aber nicht wie ich würde. Ich werde versuchen, mit Mathlab, nach Ihrem Vorschlag, die Abfrage zu verbessern. –

+0

Gern geschehen! Vielleicht könntest du diese Antwort abstimmen, wenn es dir hilft. –

Verwandte Themen