Schreibweise If Anweisung mit UPDATE

julia29

Erfahrenes Mitglied
Hi,

möchte eine Tabelle mit vielen Einträgen in 'handliche' Blöcke zu 1000 Datensätzen gliedern. So soll
von ID > 0 bis ID < 999 im Feld2 eine '1' ,
von ID > 1000 bis < 1999 im Feld2 eine '2' ,
von ID > 2000 bis < 2999 im Feld2 eine '3' ,
usw. eingetragen werden.

Einzeln klappt dies auch, nur wenn ich viele Blöcke in IF Anweisungen verschachtele dann wird nur eine Fehlermeldung ausgegeben.
Parse error: syntax error, unexpected T_IF, expecting ')'

Liegt sicher an meiner Schreibweise, nur ich sehe nicht wo der Fehler ist.
Kann mir einer helfen?

PHP:
<?php
$DatabaseHost = "localhost";
$DatabaseUser = "xxx";
$DatabasePassword = "xxx";
$Database = "usr_xxx";
$table = "tmp1";

    $DatabasePointer = mysql_connect($DatabaseHost, $DatabaseUser, $DatabasePassword);
    mysql_select_db($Database, $DatabasePointer);
	
    $dbanfrage = mysql_query(
	if ("UPDATE $table SET feld2= '1' WHERE `id` > 0 AND `id` < 999 ");
    {
    echo "bis 999 eingetragen";
    }
	
	if ("UPDATE $table SET feld2= '2' WHERE `id` > 1000 AND `id` < 1999 ");
    {
    echo "bis 1999 eingetragen";
    }
    
    if ("UPDATE $table SET feld2= '3' WHERE `id` > 2000 AND `id` < 2999 "));
    {
    echo "bis 2999 eingetragen";
    }

if (mysql_db_query ($Database, $dbanfrage, $DatabasePointer))
?>

mfg
Julia
 
Hallo,

soweit ich weiss kannst du die SQL Abfrage so nicht in die if Anweisung packen.

Ich würde die zeilen Zählen und prüfen bei welcher blogreihe (1, 2,3 usw.) zuletzt geupdatet wurde. Da dann den Wert um 1 erhöhen und alle folgenden 1000 Datensätze durch eine schleife (while) laufen lassen bis wiederum 1000 voll sind.

Wenn du die Datensätze zählen lässt, kannst du wenigstens sicher sein, das es auch immer 1000 sind.

Hm wenn du das halt wirklich so machen möchtest

PHP:
       $update = "UPDATE $table Set SET feld2= '1' WHERE `id` > 0 AND `id` < 999";
        $qry = mysql_query($update);
        if($qry == true){
        echo "bis 999 eingetragen";
        }
 
Hi v0llmilch,

den ersten Lösungsansatz verstehe ich nicht ganz, eigentlich sollte es doch schon gehen. Mein Problem ist die Schreibweise deshalb auch die Fehlermeldung.
Hatte es zuerst mit einer for-Schleife versucht, da ja hier als Bedingung ein Startwert und ein Endwert erwartet wird, also mit einer unteren und einer oberen Grenze.
Aber auch dort wurde der Syntax-Fehler ')' gezeigt.

Der zweite Lösungsansatz kommt glaube ich nicht hin. Dann könnte ich ja auch jede neue Anweisung in ein eigenes Script schreiben, kommt glaube ich dann aufs Gleiche hinaus.
 
hm mein 2ter Lösungsansatz ist das selbe wie deine Schreibweise nur in richtiger form.
 
Zuletzt bearbeitet:
erstmal etwas vorne weg, jeder 1000. Datensatz wird bei dir vergessen!
Ich würde als erstes alle Zeilen in der Datenbank zählen, diese durch 1000 teilen.
Dann kannst du mit einer FOR-Schleife arbeiten, da du das ENDE kennst.

Wenn ich nachher etwas Zeit habe, tipp ich es mal.


PHP:
$zaehle = mysql_query("SELECT * FROM $table");
$anzahl = mysql_num_rows($zaehle);

$bloecke = ceil($anzahl/1000);

$start = 0;
$ende = 1000;
for($i=1;$i<$bloecke;$i++) {
$dbanfrage = mysql_query("UPDATE $table SET feld2= '".$i."' WHERE `id` > ".$start." AND `id` <= ".$ende." ");

$start+=1000;
$ende+=1000;
}

Ungetestet, sollte aber ohne Probleme laufen!
 
Zuletzt bearbeitet:
Hi Steusi,

das ist genau so wie ich mir das Ergebnis gedacht hatte. Super.
Ich muss mir nachher den Code im Einzelnen noch mal ansehen.
Das Resultat ist OK. Vielen Dank.

mfg
Julia
 
Hi,

Ihr müsst Euch mehr mit den Möglichkeiten der Datenbank beschäftigen. So etwas kann man in einer einzigen Abfrage erledigen:

SQL:
UPDATE tabelle SET feld2 = (id DIV 1000) + 1

Ich halte das allerdings für ziemlichen Blödsinn. Wofür genau brauchst Du dieses Feld?

LG
 
Zuletzt bearbeitet von einem Moderator:
Hi kuddeldaddeldu,

vielen Dank für deinen Hinweiss, ich bin erstaunt, deutlicher kürzer und noch effektiver.

Blödsinn ist es mit diesem Feld nicht. Man kann schnell einzelne Blöcke generieren und eine gezielte Auswahl für eine weitere Anwendung nutzen. Nur relevant wenn es sich um große Datenbestände von > 1 Mio. handelt.

Danke für die Hilfe.
mfg
Julia
 
[-]Du weisst, dass du die Ergebnismenge ohne solche Tricks reduzieren kannst?

MySQL und PGSQL bietet zB Limit um die Ergebnismenge zu reduzieren.

Oracle bietet einen bitteren Hack per Rownum.

Und selbst Mssql kann was

Du koenntest das Problem ja mal anschneiden und evtl kann man ja eine bessere Loesung bieten.[/-]

Quark, folgendes Selectstatement hilft

Code:
mysql_query("SELECT * FROM $table WHERE id >= (($offset - 1) * 1000) AND id < ($offset * 1000)");

wobei $offset [1,inf) sein sollte.
 
Zuletzt bearbeitet:
Hi,

Blödsinn ist es mit diesem Feld nicht.

Doch, ist es. Noch blödsinniger ist die Logik, mit der dieses Feld gefüllt wird. Was ist, wenn Datensätze gelöscht werden? Dann gibt es Lücken im id-Wert und Deine Tausenderunterteilung ist dahin. Wenn Du die Daten in Tausender-Blöcken auslesen willst, dann nutze die LIMIT-Klausel, wie Adrian schon sagt.

LG
 
Zurück