| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

04-08-2009, 22:25
|
|
activexactive
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Beiträge: 37
|
|
sql letzten 5 + limit
hey zusammen. ich möchte auf meiner präsentz "community" meinen besuchern die möglichkeit bieten die letzten 5 profilbesucher anzeigen zu lassen. das ist auch kein problem in dem ich in der abfrage einfach ein limit von 5 setze. jedoch ist das so, das die besucher in der id inkrementiert werden was die datenbank auf dauer mit überflüssigem müll überfüllt.
wie kann ich die tabelle einstellen, das auch nur 5 datensätze gespeichert werden und er automatisch immer die alten übeschreibt ?
danke schonmal im vorraus und für eure denkanstöße
|

04-08-2009, 23:01
|
Abraxax
  THE REAL HAXE (Administrator)
|
|
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.621
|
|
Zitat:
|
das die besucher in der id inkrementiert werden was die datenbank auf dauer mit überflüssigem müll überfüllt.
|
Beschreibe dies mal genauer!
Ansonsten gilt ... Nutze "... ORDER BY ... DESC LIMIT 5", um die letzen 5 Einträge zu erhalten.
Das "Problem" der alten Datensätze kannst du mit einem Cron lösen, der alles, was älter als x Tage ist, entfernen kann.
|

04-08-2009, 23:10
|
|
Slava
PHP Senior
|
|
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.583
|
|
einfügen muss so aussehen
1)delete from tabelle where id=1 or id>5;
2)update tabelle set id=id-1;
3)insert into tabelle(id,.......) values(5,.......);
jetzt kannst du bei select auf limit verzichten
|

04-08-2009, 23:10
|
|
|
Einfach etwas vor der Aufbereitung der Anzeige ablaufen lassen.
SELECT count( * ) AS total, max( id ) AS max
FROM tabelle
Das Ergebnis prüfen ob total > 5 ist, wenn ja
delete from tabelle where id < #wert von max -5
|

05-08-2009, 09:56
|
|
activexactive
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Beiträge: 37
|
|
hey, danke schonmal für eure antworten.
also das von abraxas ist ja das simpelste, das hab ich so auch zuerst gemacht gehabt.
genauer beschrieben-> weiter unten
und cron.oha..hab noch nie mit cron gearbeitet. aber das ganze mit cron zu realisieren..hm..geht das auch ohne cronjob?
das von slava ist ja übrehaupt nicht anwendbar. das würde ja den quellcode sprengen und die datenbank übelst belasten wenn ich das nach diesem verfahren mache. updaten,löschen,lesen und das immer wieder :/
das von piratos kommt mir bisher am besten vor, wobei ich gerade den code nicht ganz verstehe..
SELECT count( * ) AS total, max( id ) AS max
FROM tabelle
zähle alles aus der datenbank zusammen als ein einziges ergebnis,
und was soll das mit max id ?!?!?!? zähle maximal 5 id´s oder wie?
is ja dann das gleiche wie punkt 1 so ungefähr.
die id ist doch fortlaufend da sie inkrementiert werden..
geht das nicht auf diese art und weise?
geb mir die letzten 5 id´s (also nach dem verfahren von abraxas)
und lösche alle restlichen id´s.
aber da ist das problem mit dem altersunterschied, da ja max (5 besucher) wiedergegeben werden solllen. id 5 müsste dann z.b auf id 4 runter rutschen.damit id 5 den neuen wert des neuen besuchers erhält.
oder denk ich da komplett falsch?
Geändert von activexactive (05-08-2009 um 10:01 Uhr)
|

05-08-2009, 10:37
|
|
|
Zitat:
das von piratos kommt mir bisher am besten vor, wobei ich gerade den code nicht ganz verstehe..
SELECT count( * ) AS total, max( id ) AS max
FROM tabelle
|
mit count(*) AS total wird die Anzahl der vorhandenen Datensätze gezählt
Mit max(id) AS max wird der letzte Autoincrementwert der id (id kann bei dir auch ein anderer Feldname sein) ermittelt, liegt in max vor.
Wenn also total > 5 ist dann lösche ansonsten ja nicht nötig.
Legt man eine solche Routine in den Scriptteil wo das Profil aufgerufen wird, reduziert der jeweilige Besucher die Tabelle automatisch - cron job ? Wofür ?
|

05-08-2009, 18:21
|
Abraxax
  THE REAL HAXE (Administrator)
|
|
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.621
|
|
Zitat:
Zitat von activexactive
geb mir die letzten 5 id´s (also nach dem verfahren von abraxas)
und lösche alle restlichen id´s.
|
Man schreibt mich mit "x" am Ende.
Ich meinte nicht, dass du immer alle anderen Ids direkt löscht. Du wirst doch einen Eintrag in der Datenbank haben, der den Besuch des Users als Zeitwert speichert.
Anhand diesen Zeitwertes löschst du alles was älter als x Tage ist.
Du musst dich nicht auf exakt 5 Einträge fixieren. Was ist, wenn der User ganz neu ist, und sowieso keine 5 Einträge gezeigt werden können?
|

05-08-2009, 19:05
|
|
|
Zitat:
|
Was ist, wenn der User ganz neu ist, und sowieso keine 5 Einträge gezeigt werden können?
|
Zitat:
mit count(*) AS total wird die Anzahl der vorhandenen Datensätze gezählt
Mit max(id) AS max wird der letzte Autoincrementwert der id (id kann bei dir auch ein anderer Feldname sein) ermittelt, liegt in max vor.
Wenn also total > 5 ist dann lösche ansonsten ja nicht nötig.
|
Ich selbst würde mir übrigens den Aufwand nicht machen.
Die angebliche Belastung von Mysql ist derart minimal das man normal nicht darüber reden müsste.
|

05-08-2009, 21:31
|
|
activexactive
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Beiträge: 37
|
|
ok, danke piratos..
okay  abraxax
nun ja, ich habe allerdings einen zeitstempel.
stimmt..an den zeitstempel hab ich noch garnicht gedacht. ist allerdings eine art das so umzusetzen. das problem nur daran ist. hat ein profil 5 besucher gehabt und wurde zwischenzeitlich 2 wochen lang nicht besucht dann löscht er ja praktisch den gewählten zeitraum von sagen wir mal ca 2 tage..daher..alle einträge sind dann wech...
und.. wenn der user halt noch keine besucher hatte, hatte er eben noch keine..dann wird einfach gesagt "keine besucher" oder garnix anzeigen lassen.---werbung---
ich werd mich mal an die version von piratos versuchen. mal sehen ob ich damit erfolg hab.
falls ich scheitere meld ich mich noch mal oder ich benutzt diese variante.
ich lege 5 datensätze fest ohne das diese inkrementiert werden und lass die idßs eben nach unten rutschen.. keine ahnung..ist auch nicht sehr elegant die lösung..kann doch ned so schwer sein *lach
|

06-08-2009, 13:08
|
Abraxax
  THE REAL HAXE (Administrator)
|
|
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.621
|
|
Zitat:
Zitat von activexactive
... das problem nur daran ist. hat ein profil 5 besucher gehabt und wurde zwischenzeitlich 2 wochen lang nicht besucht dann löscht er ja praktisch den gewählten zeitraum von sagen wir mal ca 2 tage..daher..alle einträge sind dann wech...
|
Nach wieviel Tagen Inaktivität eines Users wird dieser aus der DB entfernt/gesperrt/angeschrieben? Nimm diesen Wert auch zum Löschen.
|

06-08-2009, 16:56
|
|
activexactive
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Beiträge: 37
|
|
wird garnicht gelöscht. ich verwende die time funktion nur um anzuzeigen wann der profilbesucher das profil zuletzt aufgerufen hat. ich will das aber auch nicht unbedingt zeitabhängig machen.
profile werden auch nicht gesperrt und angeschrieben. diese funktion habe ich mir noch nicht geschrieben.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|