Query mit Abfrage und Einfügen

zer0

Erfahrenes Mitglied
Hallo,

ich arbeite zurzeit an einem Counter. In einer MySQL Tabelle wird die IP und die Zeit des Zugriffs gespeichert.

Nun will ich prüfen mittels eines Statements:
Ein neue Eintrag wird nur hinzugefügt wenn entweder die IP noch nicht in der Datenbank ist oder die IP zwar schon drin ist, aber die aktuelle Zeit um 24h (24*60*60 Sekunden) größer ist als die Zeit des Eintrags.

Mit PHP wäre soetwas leicht, aber dann jedes mal die Datensätze auszulesen und zu überprüfen kostet bestimmt viel Zeit. Ist so etwas mit einem Query möglich?

Gruß
 
Es in einer einzigen Abfrage zu machen, ist meines Wissens nicht möglich. Wenn es nur um die Eindeutigkeit der IP-Adresse gehen würde, wäre ein UNIQUE INDEX möglich, aber wie gesagt, dass passt ja hier nicht.

Üblicherweise wird man erst eine Abfrage starten und prüfen, ob diese ein Ergebnis liefert oder nicht.
SQL:
SELECT 1 FROM iptabelle WHERE adresse='x.x.x.x' AND datum_uhrzeit + INTERVAL 24 HOUR > NOW() LIMIT 1

Wenn die Abfrage kein Ergebnis liefert, wird eben die Spalte eingetragen.
SQL:
INSERT INTO iptabelle (adresse, datum_uhrzeit) VALUES ('x.x.x.x', NOW())

Das ganze sollte natürlich nur beim ersten Seitenaufruf stattfinden (in der Session merken, dass schon geloggt wurde, bzw. nur beim Starten der Session loggen).

Edit:
Also ich denke man bekommt es doch mit einer Abfrage hin. Das wäre dann ein abgefahrenes, verschachteltes INSERT ... SELECT. Aber das ist bestimmt nicht schneller als meine oben genannte Lösung, welche ziemlich straight forward ist. Ich hab auch jetzt nicht den Kopf daran weiter zu bauen, weil ich heute Nacht praktisch nicht geschlafen hab ;)
 
Zuletzt bearbeitet:
Erstmal vielen Dank!
Ich denke ich werde es dann auch so lösen.

Das ganze sollte natürlich nur beim ersten Seitenaufruf stattfinden (in der Session merken, dass schon geloggt wurde, bzw. nur beim Starten der Session loggen).

Daran hab ich noch garnicht gedacht, aber da hast du natürlich recht. Das wäre ja sonst ein unnötiger Perfomanceverlust.
Wenn ich dazu noch die Session Cookie lifetime auf 24h stelle, können Besucher am selben Tag, auch wenn der Benutzer den Browser zwischendurch geschloßeb hat, erkannt werden und es muss keine Überprüfung in der Datenbank stattfinden.
 
Es in einer einzigen Abfrage zu machen, ist meines Wissens nicht möglich. Wenn es nur um die Eindeutigkeit der IP-Adresse gehen würde, wäre ein UNIQUE INDEX möglich, aber wie gesagt, dass passt ja hier nicht.

Naja, wenn man statt der DATE_TIME - Spalte eine DATE-Spalte und eine TIME-Spalte anlegt, könnte man einen UNIQUE INDEX über IP & DATE-Spalte anlegen, alles wäre in Butter :)


Übrigens: IP-Adressen speichert man am Besten unter Nutzung von INET_ATON() als Integer in einer DB, spart Speicherplatz :) (dies nur so als Tipp)
 
Zurück