Alle Datenbankeinträge über 10 löschen.
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzahl
auslese
auszahlung
befehl
befinden
bild
bleiben
code
dank
datenbank
datum
eintrag
hilfe
idee
limit
ordern
schleife
schleifen
syntax
url
-
Hallo,
ich kenne mich nicht wirklich mit Mysql aus, daher würde ich mir sehr freuen wenn jemand eine Idee hatte wie man es verwirklichen kann.
Ich habe per DESC LIMIT meine anzeige auf 10 verkürzt. Da nun alles was über 10 einträge ist Datenmüll ist wo nicht mehr gebraucht wird, möchte ich diese aus der Datenbank löschen.
Meine Idee war jetzt diese:
DELETE FROM va_auszahlungen Group by uid ORDER BY id DESC LIMIT 10, 100000
uid= Die ID des Users, diese ist immer gleich.
ID= Die ID der Auszahlung, jede Auszahlung bekommt eine neue ID.
Also dachte ich mir das ich von der uid die id sortiere und dann alles löschen was über 10 kommt, denn diese sind ja Datenmüll.
Dies geht nicht:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Group by uid ORDER BY id DESC LIMIT 10, 100000' at line 1
Hat jemand eine Idee wie man das sonst noch machen könnte?
MySQL-Version : 5.1.56
Beitrag zuletzt geändert: 21.6.2011 17:44:07 von loma -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Alles über ID 10 soll gelöscht werden?
DELETE FROM va_auszahlungen WHERE id > 10;
Meinst du so? Oder meinst du alle Einträge nach dem 10. Eintrag?
EDIT:
Wäre dann warscheinlich sowas wie
DELETE FROM va_auszahlungen ORDER BY id LIMIT 10;
Beitrag zuletzt geändert: 21.6.2011 17:51:47 von fabo -
Ja, ich meine alle Einträge nach dem 10. Eintrag. Das problem besteht aber darin das die Einträge bestimmten Usern zugeordnet sind deswegen auch die Spalte uid. Es soll also von jedem User nur 10 einträge vorhanden sein, deshalbt wäre DELETE FROM va_auszahlungen ORDER BY id LIMIT 10; nicht sinnvoll.
UID = Die Userid von einem User.
ID = Die ID der Auszahlung (neuste Auszahlung = höhrere ID)
Hier mal ein Bild der Datenbank:
http://www.bilder-space.de/bilder/823194-1308678264.png
Also müsste man eigentlich irgendwie die Uid gruppieren und die ID sotieren und alles was drunter ist löschen. Also so das die 10 größten letzen ID´s von der Uid bestehen bleibt.
Beitrag zuletzt geändert: 21.6.2011 19:46:10 von loma -
Arbeitest du zufällig mit PHP? Das würde die Sache vereinfachen, wenn nicht sogar erst ermöglichen.
Was du vor hast, ist nicht ohne Weiteres zu machen. Du musst vorab eine Liste aller UserIDs erstellen und diese dann in einer Schleife abarbeiten. Es gibt bei MySQL schon die Möglichkeit, mit Schleifen zu arbeiten. Ich selbst hab mich damit aber nie beschäftigt, weil ich nur mit PHP+MySQL arbeite und das Ganze mit PHP wesentlich einfacher ist.
Beitrag zuletzt geändert: 21.6.2011 19:56:28 von fabo -
Also es müsste eine Möglichkeit geben alle Einträge in ein 2dimensionales array zu laden, dieses per Schleife durchzugehen und in einem weiteren array für jeden User die Anzahl hochzuzählen, sobald diese Zahl über 10 ist, könnte man den Eintrag dann löschen. Ich weis gerade nicht auswendig, wie die Befehle lauten, aber ich schaue mal kurz in meinen Quellcodes nach, dort habe ich zumindest ähnliche Schleifen....
-
Dann würde ich erst alle User aus der Tabelle auslesen und dann mittels Schleife den Delete-Befehl raushauen:
DELETE FROM va_auszahlungen WHERE uid = ".$row['uid']." ORDER BY id ASC LIMIT 10
So werden Alle Einträge von User xyz aus der DB gelöscht und nur die letzten 10 bleiben übrig (weil es sich hierbei ja um die aktuellsten 10 handelt).
Musst du natürlich vorher ne Datensicherung machen und ausprobieren. Sollte aber eigentlich gehen.
<?php // MySQL-Verbindung herstellen... // Alle User aus va_auszahlungen auslesen $result = mysql_query("SELECT uid FROM va_auszahlungen") or die(mysql_error()); while($row = mysql_fetch_array($result)) { // Löschprozedur mysql_query("DELETE FROM va_auszahlungen WHERE uid = ".$row['uid']." ORDER BY id ASC LIMIT 10") or die(mysql_error()); } ?>
EDIT:
Du musst übrigens ASC anstatt DESC benutzen, sonst löscht er verkehrt herum ;)
Beitrag zuletzt geändert: 21.6.2011 20:38:52 von fabo -
hier einmal der komplette code meiner Idee:
<?PHP $abc = "select * from va_auszahlungen order by uid asc"; $erc = mysql_query($abc); while($row = mysql_fetch_object($erc)) { if($aktuelle_uid!=$row->uid) { $aktuelle_uid=$row->uid; $anzahl=0; } $anzahl++; if($anzahl>10) { mysql_query("delete from va_auszahlungen where id=$row->id"); } } ?>
das kommt fabo schon ganz nahe, allerdings würde ich mich nicht auf limit verlassen, sondern per variable die Einträge zählen. Du solltest aber auch hier erstmal ein Backup machen. Falls die Datei nicht viel zu groß ist, kannst du mir die Tabelle auch schicken (inphpmyadmin exportieren) und ich mache das dann. bei interesse melde dich per PN.
Edit: Dann musst du bei mir vermutlich auch asc statt desc verwenden. -> ändere ich im code jetzt auch...
Beitrag zuletzt geändert: 21.6.2011 20:45:24 von firewave3 -
allerdings würde ich mich nicht auf limit verlassen
Begründung?
Ich habe die Erfahrung gemacht, dass man bei solchen Abfragen mal schnell durch einen kleinen Fehler alles löschen kann :( Deshalb lasse ich prinipiell alles von variablen absichern, um im Problemfall schneller Lösungen finden zu können, weil ich dann die Werte ausgeben lassen kann und mysql nicht für mich unsichtbar irgendetwas macht.
Ich sehe auch gerade, dass bei mir die Reihenfolge der id durcheinander gerät und so nicht unbedingt die neusten Einträge übrig bleiben. Das würde so alles ziemlich kompliziert werden. Deine Version ist also besser :D
Beitrag zuletzt geändert: 21.6.2011 20:58:37 von firewave3 -
loma schrieb:
Danke euch beiden für eure hilfe! Ich habe das nun mal gestestet und es funktioniert wunderbar! Also es befinden sich nun von jedem User nurnoch 10 einträge in der Datenbank
Danke!!
trotz abschluss möchte ich da noch eine bemerkung loswerden:
weil es um 'auszahlung' geht, kann ene löschung von daten eventuell juristische probleme aufwerfen. für den fall solltest du statt löschen, die daten ausmaskieren/unsichtbar machen (für den user - nicht aber für den admin).
lg -
Hier mal noch die etwas elegantere variante mit einer SP:
DELIMITER $$ DROP PROCEDURE IF EXISTS CleanUpPayments$$ CREATE PROCEDURE CleanUpPayments() BEGIN DECLARE userId INT; DECLARE userCursor CURSOR FOR SELECT DISTINCT uid FROM va_auszahlungen; DECLARE entryCount INT; DECLARE removeCount INT; DECLARE no_more_rows BOOLEAN; DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE; OPEN userCursor; fetch_loop: LOOP FETCH userCursor INTO userId; IF no_more_rows THEN CLOSE userCursor; LEAVE fetch_loop; END IF; SELECT COUNT(*) INTO entryCount WHERE uid = userId; SET removeCount = entryCount - 10; IF entryCount > 10 THEN DELETE FROM va_auszahlungen WHERE uid = userId ORDER BY id ASC LIMIT removeCount; END IF; END LOOP fetch_loop; END$$ DELIMITER;
der Aufruf sollte dann etwa so aussehen:
EXECUTE CleanUpPayments();
Code ist nicht getestet, sollte aber so funktionieren. Habe jedoch noch nicht soviel mit SP's gemacht, also bitte nicht auf Produktivservern testen ;) und immer schön backups machen.
grüße
Doomdrake -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage