2016-10-04 3 views
0

Ich habe seit zwei Tagen mit einem Problem zu kämpfen, und ich brauche Hilfe.Abrufen von Wert in Reihenfolge und Subtraktion Zeilen mit mySQL

Ich möchte Subtraktion auf aufeinander folgenden Zeilen in einer SQL-Tabelle, sondern durch Sortieren von Werten vor.

Zum Beispiel habe ich meine Tabelle wie diese:

Name  | Activity | Day 
John | Tennis | Day10 
Bob | Swimming | Day9 
Mathilda | Tennis | Day2 
John | Swimming | Day2 
Bob | Tennis | Day2 
John | Computer Science | Day 10 

In dieser Tabelle würde ich für die Personen wissen, die mehr als eine Aktivität, was die Zeit zwischen zwei Aktivitäten.

Also in diesem Beispiel, wenn wir Tage subtrahieren können, sehen wir, als John und Bob zwei Aktivitäten haben und die maximale Zeitpause für sie von John mit 8 Tagen erreicht wird.

Ich habe versucht, es wie dies zu tun:

SET @previousDay:=0; 

SELECT Name, days, @previousDay - day, @previousDay:=day 
FROM table 
WHERE Name IN (SELECT Name FROM table group by Name having count(Name) > 1) 
ORDER BY Name, Day 

Aber das ist völlig falsch, wie die ORDER BY nach der Substraktion erfolgt. Ich sehe das gute Ergebnis nicht, weil ich die Subtraktion mit aufeinanderfolgenden Werten für Tage sortiert machen möchte.

Es scheint, dass ich das IN-Ergebnis nicht sortieren kann, also wissen Sie, ob es eine Möglichkeit gibt, mein Problem zu lösen?

Vielen Dank für Ihre Hilfe !!!

BTW: Ich weiß nicht, wie man den Tisch richtig formatiert, so würde jede Hilfe geschätzt werden, danke viel!

Antwort

0

Sie können dies tun:

select t.*, (previousDay - day) as diff 
from (select t.*, 
      (@pd := (case when @n <> name 
          then if(@n := name, NULL, NULL) -- does happen 
          when (@tmp_pd := @pd) = null then null  -- never happens 
          when (@pd := day) = null then null -- never happens 
          else @tmp_pd 
         end) 
      ) as previousDay 
     from t cross join 
      (select @n := '', @pd = -1) params 
     order by name, day 
    ) t 
where previousDay is not null; 

Beachten Sie, dass dies eine große Anstrengung durchläuft in einem einzigen Ausdruck alle Operationen auf Variablen zu setzen (daher der seltsame = NULL in den case Bedingungen). Der Grund ist, dass MysQL nicht die Reihenfolge der Auswertung von Ausdrücken in einer select-Klausel garantiert, sodass mehrere Zuordnungen in der falschen Reihenfolge ausgewertet werden können.

+0

Vielen Dank für Ihre Hilfe und Ihren Kommentar, das ist wirklich hilfreich. Unvorstellbar bekomme ich nur NULL-Werte wegen der @n <> name Bedingung auf meinem Tisch, ich weiß nicht warum. Ich habe versucht, den Wertnamen zu @n in der Select-Abfrage zuweisen, aber es ändert nichts. Ich werde versuchen, das zu lösen. Vielen Dank für Ihre Antwort Ich habe viel gelernt, indem ich Ihren Code gesehen habe. – Mike

+0

@Mike. . . Ich habe etwas vergessen. –

Verwandte Themen