DELETE mit LIMIT geht das?!

lifehunter

Erfahrenes Mitglied
Ich wollte folgendes bei mir bei miener MySQL Datenbank ausführen:
Code:
DELETE FROM `outbox` WHERE `von`='1' AND `lesen`>'0' LIMIT 0, 10
Nun spuckt er mit aber diesen Fehler aus:
Code:
#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 ' 10' at line 1
Wo liegt mein Fehler? Kann man LIMIT überhaupt bei DELETE nutzten?
MfG
 
Ich dachte LIMIT besteht immer aus 2 Zahlen. 1. Anfang 2. Anzahl von Datensätzen?!
Also ich hab des nun bei dem Link gesehen das man bei DELETE nicht mit dem mir bisher bekannten LIMIT arbeiten kann.
Um noch mal kurz zu beschreiben wofür ich die DELETE Funktion brauche. Ich hatte bisher einen Link der alle Datensätze von einem aus der Datenbank löscht die schon gelesen wurden. Nun habe ich aber eine Blätterfunktion in die Mailbox eingebaut und nun will ich nur alle Datensätze löschen die auf dem einem "Blatt" sind. Das heißt z.B. 20 Datensätze, angefangen beim 40 Datensatz.
Ne Idee wie ich das machen könnte
 
Hi

ich denke mir folgendes
Du hast eine Blätterfunktion und wählst Dir über eine Abfrage (where-Bedingung) eine bestimmte Anzanhl an Datensätzen aus, die evtl. gelöscht werden sollen.

Ich könnte mir vorstellen, dass order by noch eine Rolle spielt, sonst würde die Auwahl zwischen z.b. 20 und 40 keinen Sinn machen, wenn nicht eine Sortierung stattfindet.
 
Bist Du Dir sicher, dass mit dem LIMIT 10 auch die gewünschten 10 Datensätze und nicht vielleicht 10 andere gelöscht werden?

Nach meinen Verständnis ist die Reihenfolge beim SELECT (und wohl auch beim DELETE) nicht zwingend immer gleich (es sei denn, du verwendest eine entsprechende Sortierung)

Ich könnte mir vorstellen, dass es Probleme geben kann.
Es sei denn, es ist dir egal, welche 10 Einträge gelöscht werden.

vop
 
also meine erste abfrage sieht so aus
PHP:
mysql_query("SELECT `ID`,`von`,`betreff`,`date`,`lesen` FROM `inbox` WHERE `an`='1' ORDER BY `date` DESC LIMIT 0, 20");

wenn ich nun auf der "3. Seite" bin dann ändert sich bei der Abfrage nur der Teil mit dem LIMIT:
PHP:
...LIMIT 40, 20...
Also mir ist eingefallen das man ja bei DELETE mit WHERE arbeiten könnte und dann einfach alle ID´s angibt die auf der jeweiligen Seite sind. Dies wäre aber ziehmlich aufwendig, findet ihr nicht auch?
 
Hmmm...

ich persönlich finde diese Lösung mit der Limit-Einschränkung etwas suspekt.

Bsp. Du hast 100 Datensätze insgesamt.

Beim Hin- und Herblättern möchtest Du nur bestimmte Seiten löschen z.B. ab 40 die nächsten 20, ab 60 die nächsten 20...

Woher weisst Du, welche Du gerade aus dieser Seite löschen willst? Vielleicht sind unter diesen 20 Datensätzen auf einer Seite welche drauf, die nicht gelöscht werden sollen. Das hängt aber von eine Bedingung ab, nicht von der Seitenzahl.

Das verstehe ich nicht. Auch wenn man die Möglichkeit nimmt, diese erst über einen Select vorzuselectieren und dann diese Auswahl zu löschen.

Gerade auch beim Delete wäre ich eher vorsichtig.
 
PHP:
mysql_query("select date from outbox WHERE `von`='1' AND `lesen`>'0' order by date desc  limit 30,1");
#dann date auslesen mit dem datewert weiter arbeiten
$row = mysql_fetch_array();
$datewert = $row[data];
mysql_query("DELETE FROM `outbox` WHERE `von`='1' AND `lesen`>'0'  and  date >= '$datewert' order by date desc LIMIT  10");

rein Theroretisch - keine Gewähr auf Richtigkeit :-)
 
Ab Version 4.1 könntest Du vielleicht mit einem Subquery arbeiten:
Code:
DELETE
  FROM `outbox` 
  WHERE `von`='1' 
    AND `lesen`>'0' 
    AND `ID` IN (SELECT `ID`
        FROM `inbox` 
        WHERE `an`='1' 
        ORDER BY `date` DESC 
        LIMIT 0, 20)
(Ich habe einfach mal die zwei geposteten Querys gemischt. Wahrscheinlich sollte es wohl in beiden Fällen entweder inbox oder outbox heißen.)

Die Idee, alle zu löschenden IDs explizit zu übergeben, finde ich, angesichts des radikalen Vorgangs (die Daten sind schließlich hinterher weg), sehr sinnvoll.

Gruß hpvw
 
Zurück