Check ob user heute eingeloggt ist

05/15/2019 00:49 Cc_Cc_Cc#1
Hi Com,

ich wollte es so machen dass, wenn man 3 tage hintereinander eingeloggt ist , man eine Trophäe erhaltet.

Jetzt habe ich eine Tabelle erstellt namens: Logged_in_a_row

Wenn man sich einloggt, kommt ein Eintrag rein mit der User_id und den Datum.

Bevor aber der Datensatz eingetragen wird muss ich ja eine Abfrage machen ob sich der User am letzen Tag noch angemeldet hat, falls nicht werden alle Einträge wieder gelöscht, weil wenn der User sich 2 tage hintereinander eingeloggt hat, und nach 3 Tagen sich wieder einloggt, gilt es ja nicht mehr.

Jetzt frage ich mich ob es dafür ein SQL-Code gibt.

Ich habe es bisher so geschrieben:

Quote:
PHP Code:
SELECT `user_id`,`dateFROM `logged_in_a_rowWHERE `user_id` = :session_id AND `date` > DATE_SUB(CURDATE(), INTERVAL 1 DAYORDER BY `dateDESC LIMIT 1
Der sagt aber ja ob innerhalb der letzen 24 Stunden sich der User eingeloggt hat. Wollte es aber so machen dass, wenn der Tag vorbei ist , direkt ein neuer Datensatz eingetragen wird, wenn sich gestern einer eingeloggt hat ist egal ob es um 23:59 war und direkt der nächste Tag beginnt. Geht das überhaupt mit SQL? Hoffe ihr habt mich verstanden<.<
05/15/2019 01:22 Warnuk3r#2
So macht man das nicht, diese Logik hat in der SQL-Query nichts zu suchen.

Du legst 1 Datensatz an mit UserID, Datum und Anzahl Tage. Wenn der User sich einloggt, ziehst du dir das Datum und dann überprüfst du ob das Datum 1 Tag zurück liegt. Falls ja, dann +1 bei Anzahl Tage und überprüfen, ob man dann bei 3 wäre. Falls das Datum nicht 1 Tag zurück liegt, dann überprüfst du ob das Datum 2+ Tage zurück liegt und falls ja, dann Anzahl Tage auf 1 setzen, da die "Einlog-Serie" dann wieder von neu los geht.

So wie du es machen willst hättest du pro User bis zu 2 Datensätze und müsstest beim Abbruch einer "Einlog-Serie" dann 2 Datensätze löschen + 1 wieder erstellen. Das ist ineffektiv.
05/15/2019 01:50 Cc_Cc_Cc#3
Quote:
Originally Posted by Warnuk3r View Post
So macht man das nicht, diese Logik hat in der SQL-Query nichts zu suchen.

Du legst 1 Datensatz an mit UserID, Datum und Anzahl Tage. Wenn der User sich einloggt, ziehst du dir das Datum und dann überprüfst du ob das Datum 1 Tag zurück liegt. Falls ja, dann +1 bei Anzahl Tage und überprüfen, ob man dann bei 3 wäre. Falls das Datum nicht 1 Tag zurück liegt, dann überprüfst du ob das Datum 2+ Tage zurück liegt und falls ja, dann Anzahl Tage auf 1 setzen, da die "Einlog-Serie" dann wieder von neu los geht.

So wie du es machen willst hättest du pro User bis zu 2 Datensätze und müsstest beim Abbruch einer "Einlog-Serie" dann 2 Datensätze löschen + 1 wieder erstellen. Das ist ineffektiv.
Nehmen wir mal an er hat sich eingeloggt und ich zähle dann den Tag +1. Er loggt sich aus und nach 2 Minuten loggt er sich wieder ein. Dann wird der Tag ja wieder +1 gemacht.
05/15/2019 03:15 Mikesch01#4
Prüf dann zusätzlich noch ob das Datum eben das heutige Datum schon ist. Wenn ja, dann zähle es nicht mehr.
05/15/2019 12:20 False#5
Hol dir einfach alle Datensätze die <= 3 Tage alt sind und gruppier diese nach dem Tag.
Somit kannst du leicht prüfen ob er 3 Tage hintereinander eingeloggt war.

Mit dieser Lösung wäre es auch egal wenn er sich 10 Mal pro Minute einloggt, da du das Datum ja gruppierst.
Ebenso müsstest du auch keine Datensätze löschen, da wenn er ein Tag nicht eingeloggt war, maximal 2 Tage aus der Query zurück kommen können.