MySQL Differenz Logeintrag ermitteln

Greaseball100

Well-known member
ID: 105292
L
4 Juli 2006
118
10
Hallo

Ich versuche seit Tagen folgendes Problem zu lösen.

Ich logge jeden Flashslot mit.
Sprich bei jedem Spiel wird ein Eintrag gemacht u.a auch die Zeit ala "2009-11-27 19:05:22".

Jetzt versuche ich per Query zu ermitteln ob es Einträge gibt deren Differenz kleiner 3 Sekunden ist und das für jeden einzelnen User um zu prüfen ob ein User einen Slot mehrmals spielt oder evtl. mit mehreren Slots gleichzeitig.

Bisher habe ich dies nur bei der Anzeige der Logeinträge realisert, also die Logzeit wird in einer Variable gespeichert und beim nächsten Durchlauf geprüft ob die Differenz zwischen der Variablen und des nachsten Eintrages kleiner als 3 Sekunden ist.

Ist es möglich per Query nur die Logeinträge sich anzeigen zu lassen, deren Differenz kleiner 3 ist und wenn ja wie?

Bitte keine fertigen Querys sondern nur einen Denkanstoß geben...

Danke.
 
Vielleicht kannst du einen JOIN durchführen mit der gleichen Tabelle, nach KID, sodass an die jeweilige Zeile der Eintrag ge"joint" wird, dessen Zeit weniger als 3 Sekunden unterschied beträgt. Ein INNER JOIN löscht dann alle Zeilen, die kein Gegenstück (= weniger als 3 Sekunden Unterschied) haben.
 
Hast du einen fortlaufenden Surrogatschlüssel? Falls ja, gehts mit dem Auto-JOIN.
 
Verstehe nur den Zusammenhang nicht.
Du kannst dann ja mittels
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] a.id, b.time - a.time [B][COLOR=#9932cc]AS[/COLOR][/B] timediff
[B][COLOR=#9932cc]FROM[/COLOR][/B] table a
[B][COLOR=#9932cc]JOIN[/COLOR][/B] table b [B][COLOR=#9932cc]ON[/COLOR][/B] b.id = a.id + 1[/FONT]
den (chronologisch) nachfolgenden Datensatz holen und vergleichen.
Ohne Surrogat wüsstest du ja nicht, welchen Datensatz du dazuJOINen musst.
 
Mein Lösungsansatz sieht momentan so aus:

PHP:
SELECT
l1.id,l1.uid,UNIX_TIMESTAMP(l2.datum)-UNIX_TIMESTAMP(l1.datum) as timediff,
DATE_FORMAT(l1.datum,'%d.%m.%Y %H:%i:%s') datetime_datum,
l1.spiel game
FROM ".DB_PREFIX."_log_games l1
JOIN ".DB_PREFIX."_log_games l2
ON l2.id=l1.id+1
WHERE l1.uid=l2.uid && l1.spiel=l2.spiel && l1.id!=l2.id
HAVING timediff<3
ORDER BY l1.datum DESC
LIMIT 30

Jetzt hab ich nur ein Problem.
So wie der Query aussieht, findet er nur Eintrage deren ID direkt, sagen wir mal - nebeneinander - liegen.
Aber die Einträge können auch so aussehen.

ID UID SPIEL DATUM
1 1 Spiel1 2010-02-02 10:00:00
2 2 Spiel1 2010-02-02 10:00:00
3 1 Spiel1 2010-02-02 10:00:00

Bei dem Query würde er diesen Eintrag überspringen, oder hab ich was übersehen??
 
Achja, das soll per User sein... dann wirds schwer.

Mal ein Ansatz:
Code:
[FONT=Courier New][B][COLOR=#9932cc]CREATE VIEW[/COLOR][/B] log_games_sorted [B][COLOR=#9932cc]AS[/COLOR][/B]
[B][COLOR=#9932cc]SELECT[/COLOR][/B] id, uid, datum
[B][COLOR=#9932cc]FROM[/COLOR][/B] log_games
[B][COLOR=#9932cc]ORDER[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] uid [B][COLOR=#9932cc]ASC[/COLOR][/B], id [B][COLOR=#9932cc]ASC[/COLOR][/B];[/FONT]
Dann hast du ja die relevanten Tupel "untereinander" (bis auf die Grenzstellen, wo ne neue UID beginnt). Die Frage is nur, ob das was bringt :think:
 
Versuch doch mal sowas:


PHP:
SELECT benötigte-daten
FROM log_games A
INNER JOIN
log_games B
ON A.uid = B.uid
AND A.id < B.id
AND A.datum >= b.datum - 3 seconds