SQL: Datensätze mit neuer IP ausgeben

SQL, Dateimanagement - Sprachunabhängige Datenhaltung
Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

SQL: Datensätze mit neuer IP ausgeben

Beitrag von naums » Mo Okt 03, 2011 8:48 pm

Hallihallöchen,

Ich hab (glorreicherweise) einen neuen Counter auf meiner Homepage eingebaut, der nicht mehr jede IP einmal pro tag misst, sondern jede IP immer einträgt. So lässt sich besser verfolgen, was der Besucher auf meiner Seite anschaut und auch lassen sich so besser hits auf bestimmte Seiten zählen.

Allerdings will ich auf meiner Homepage (Startseite) lediglich jede IP einmal pro Tag zählen lassen. Sozusagen will ich alle neuen IPs an einem Tag zählen, und das für alle Tage wiederholen. folgende Spalten sind dabei von Bedeutung: ip - Text (gibt die IP Addresse an.), date - int (gibt den Timestamp an).

Gibt es eine Möglichkeit das mithilfe von SQL direkt abzufragen OHNE dabei meinen Server zu killen?

MfG Naums
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: SQL: Datensätze mit neuer IP ausgeben

Beitrag von cloidnerux » Mo Okt 03, 2011 9:01 pm

SELECT DISTINCT ip FROM deinerTabelle WHERE date=heuteOderSo
Das zeigt alle IPs für einen Tag einmal an und
SELECT DISTINCT ip, date FROM deinerTabelle
wird für jeden einzelnen tag die jeweiligen IPs ausgeben.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: SQL: Datensätze mit neuer IP ausgeben

Beitrag von naums » Mo Okt 03, 2011 9:26 pm

löst das Problem mit den neuen IPs. Aber nicht das mit dem Datum. Theoretisch könnte ich das mit PHP machen, indem ich danach überprüfe ob eine IP schonmal da war und ob das am selben tag war. Ich hab aber die befürchtung, dass der Server damit überlastet sein wird. Schließlich wären das weit mehr als 1000 Abfragen und Berechnungen.

Kann MySQL einen Timestamp in ein Datum verwandeln und danach prüfen, dass die IP am Tag einmalig ist? eigentlich will ich sowas wie:

Code: Alles auswählen

SELECT count(id) as id FROM `counter` WHERE { IP AM TAG EINMALIG }
und für heute:

Code: Alles auswählen

SELECT count(id) as id FROM `counter` WHERE `date`=time() AND { IP AM TAG EINMALIG }
MfG Naums
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: SQL: Datensätze mit neuer IP ausgeben

Beitrag von cloidnerux » Mo Okt 03, 2011 9:31 pm

Aber nicht das mit dem Datum.
Achso, du hast nur nen Timestamp?
Sag das doch!
. Ich hab aber die befürchtung, dass der Server damit überlastet sein wird. Schließlich wären das weit mehr als 1000 Abfragen und Berechnungen.
Probiers aus, 1000 ist jetzt noch keine So große zahl, vorallem nicht für Computer.-
Ich hatte bei einem Analyseprogramm die Befürchtung, dass mein Laptop mit den 2 Millionen Datensätzen nicht zurechtkommt, aber am ende gings doch.

Solange so eine Anfrage nur selten erfolgt, ist das Problem noch kleiner.

Du könntest dir aber auch ne eigene Tabelle anlegen, wo du automatisiert alle 24h die Zugriffszahlen updates, morgens um 3 oder so sollte die Nutzung so niedrig sein, das das ohne bedenken geht.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: SQL: Datensätze mit neuer IP ausgeben

Beitrag von naums » Mo Okt 03, 2011 11:10 pm

Die Abfrage wird genau dann ausgeführt, wenn jmd. auf meine Homepage (Startseite) geht. Das war seit dem 09.07.2011 knapp 350 Mal der Fall. Ich habe allerdings die Befürchtung, dass es deutlich mehr wird, sobald die Seite auf ne .de-Domain kommt.

PS: sobald jmd. nachts um 3 auf meine Seite geht, gänge das mit dem Update, allerdings muss das ja net unbedingt sein. Da könnte ich auch den alten Counter drinnen lassen. Den will ich eigentlich aus Performance-gründen loswerden.
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: SQL: Datensätze mit neuer IP ausgeben

Beitrag von Xin » Di Okt 04, 2011 9:57 am

naums hat geschrieben:Kann MySQL einen Timestamp in ein Datum verwandeln und danach prüfen, dass die IP am Tag einmalig ist? eigentlich will ich sowas wie:
Wie sieht's umgekehrt aus?

Ein Tag ist ein Timestamp, der größer ist als die letzte Sekunde des vorherigen Tages und kleiner als die erste Sekunde des nächsten Tages.

Statt also date == heute nimmst Du timestamp > kurzVorHeute and timestamp < kurzNachHeute.


1000 Abfragen pro Seitenaufruf!? Oder pro Tag?
Und wenn das pro Seitenaufruf ist - wie kommen die denn zusammen!?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

C@mper
Beiträge: 88
Registriert: Mo Nov 15, 2010 3:30 pm

Re: SQL: Datensätze mit neuer IP ausgeben

Beitrag von C@mper » Di Okt 04, 2011 11:20 am

naums hat geschrieben: Kann MySQL einen Timestamp in ein Datum verwandeln und danach prüfen, dass die IP am Tag einmalig ist? eigentlich will ich sowas wie:

Code: Alles auswählen

SELECT count(id) as id FROM `counter` WHERE { IP AM TAG EINMALIG }
MfG Naums
meintest Du sowas?

Code: Alles auswählen

SELECT COUNT(id) FROM `counter`WHERE ip = '191.168.0.5'   AND   DATE(date) = CURDATE();

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: SQL: Datensätze mit neuer IP ausgeben

Beitrag von naums » Di Okt 04, 2011 7:49 pm

Von der Sache her ja.

1. Das funzt leider net. Liefert ein leeres Resultat zurück.
2. Das sucht nur nach EINER ip, ich suche aber jede neue IP. Es darf nie die gleiche IP am gleichen Tag gezählt werden, allerdings muss die gleiche IP am nächsten Tag gezählt werden.

Zusammenzählen ist ne einfache Geschichte in PHP, allerdings will ich den Server wie gesagt nicht killen indem ich den Apache alles Filtern lasse. :D

MfG naums
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: SQL: Datensätze mit neuer IP ausgeben

Beitrag von Xin » Di Okt 04, 2011 7:57 pm

naums hat geschrieben:Von der Sache her ja.

1. Das funzt leider net. Liefert ein leeres Resultat zurück.
2. Das sucht nur nach EINER ip, ich suche aber jede neue IP. Es darf nie die gleiche IP am gleichen Tag gezählt werden, allerdings muss die gleiche IP am nächsten Tag gezählt werden.

Zusammenzählen ist ne einfache Geschichte in PHP, allerdings will ich den Server wie gesagt nicht killen indem ich den Apache alles Filtern lasse. :D
Schau Dir mal "ORDER BY" an. Genaue Syntax mit Count müsste ich selbst auch nochmal nachgucken.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

C@mper
Beiträge: 88
Registriert: Mo Nov 15, 2010 3:30 pm

Re: SQL: Datensätze mit neuer IP ausgeben

Beitrag von C@mper » Mi Okt 05, 2011 7:15 am

naums hat geschrieben:Von der Sache her ja.

1. Das funzt leider net. Liefert ein leeres Resultat zurück.
2. Das sucht nur nach EINER ip, ich suche aber jede neue IP. Es darf nie die gleiche IP am gleichen Tag gezählt werden, allerdings muss die gleiche IP am nächsten Tag gezählt werden.

Zusammenzählen ist ne einfache Geschichte in PHP, allerdings will ich den Server wie gesagt nicht killen indem ich den Apache alles Filtern lasse. :D

MfG naums
Dann doch wie cloidnerux schon sagte, mit DISTINCT.

Code: Alles auswählen

SELECT DISTINCT ip FROM `counter` WHERE DATE(date) = CURDATE(); 
zeigt Dir alle IP's von heute an, aber jede nur einmal.

Code: Alles auswählen

SELECT COUNT(DISTINCT ip) FROM `counter` WHERE DATE(date) = CURDATE();
zeigt Dir die Menge der verschiedenen IP's von heute an.

Code: Alles auswählen

SELECT DISTINCT ip FROM `counter`; 
zeigt Dir alle IP's über den gesamten Zeitraum an, aber jede nur einmal.

Code: Alles auswählen

SELECT COUNT(DISTINCT ip) FROM `counter` ;
zeigt Dir die Menge der verschiedenen IP's über den gesamten Zeitraum an.

Antworten