2016-04-26 6 views
1

Guten Tag alle, ich habe eine mySQL-Tabelle, die wie folgt aussieht verbraucht zu berechnen:Effiziente Möglichkeit, die Zeit von jedem Benutzer auf einem System

|Id |username   |timestamp    |timestring  | 
+---+-------------------+-----------------------+---------------+ 
|4 |user1    |2016-02-11 11:50:21 |20160211115021 | 
|3 |user3    |2015-12-04 15:55:46 |20151204155546 | 
|2 |user2    |2015-12-03 19:54:48 |20151203195448 | 
|1 |user1    |2015-11-27 10:24:30 |20151127102430 | 
+---+-------------------+-----------------------+---------------+ 

Und dies zeigt die Zugriffsprotokolle auf einem gegenseitigen Ausschluss Panel (nur eine Person kann jedes Mal eingeloggt bleiben). Was ich tun möchte, ist, einige Statistiken zu haben, die meisten von ihnen sind ziemlich geradlinig, aber ich habe Schwierigkeiten bei der Berechnung der Zeit auf dem Panel verbracht, würde ich gerne für jeden Benutzer wissen, wie viel Zeit er/sie hat das System "blockiert".

tatsächlich, ich erstelle ein Array von Benutzernamen, in denen ich stufenweise alle Sekunden die Benutzer haben von der "nächsten" (ID) genommen.

Ich denke, das ist sehr zeitaufwendig für das System, und ich hätte gerne einen effizienteren Weg, es zu tun, gibt es eine Möglichkeit, dies mit mySQL zu erreichen, oder ist es besser, eine neue Tabelle zu erstellen, in der ich Speichern Sie einfach alle Benutzernamen und fügen Sie die Uhrzeit von Zeit zu Zeit hinzu? Oder ist es besser, PHP zu verwenden?

Ich muss bedenken, dass die mySQL ist eine gemeinsame, so dass meine Ressourcen nicht unbegrenzt sind.

Antwort

1

Im Allgemeinen würde ich eine Unterabfrage erstellen, die Ihre Tabelle auf sich selbst mit dem ID-Feld, wobei die ID aus der rechten Seitentabelle ist größer als die ID auf der linken Seite und erhalten Sie die min (timestamp) von der rechte Beistelltisch. In der äußeren Abfrage summiert nur die Differenz zwischen dem dem 2 Zeitstempel:

select t.username, sum(t.endtime-t.starttime) as seconds 
from 
    (select t1.id, t1.username, t1.timestamp as starttime, min(t2.timestamp) as endttime 
    from yourtable t1 
    left join yourtable t2 on t1.id<t2.id 
    group by t1.id, t1.username, t1.starttime) t 
group by t.username 

Wenn Sie wissen, dass keine Lücken in dem ID-Feld geben, dann können Sie Ihre Abfrage vereinfachen:

select t1.username, sum(t2.timestamp-t1.timestamp) as second 
from yourtable t1 
left join yourtable t2 on t1.id+1=t2.id 
group by t1.username 
+0

sehen wirklich Nett, ich kann nicht darüber nachdenken (ich bin nicht so erfahren, und ich kann zumindest ein paar Joins machen), ich werde es versuchen, um zu verstehen, wie es funktioniert, aber es sieht wirklich ordentlich aus. –

+0

@RickJames du meinst die zweite, weil die erste noch funktionieren würde. Und ich habe darauf hingewiesen, dass die 2. Lösung nur funktioniert, wenn keine Lücke in den IDs ist. – Shadow

+0

Hoppla! Du hast Recht. Ich lösche meinen Kommentar. –

Verwandte Themen