Select und Update kombinieren
RuD
- datenbank
Seid gegrüßt!
ich habe eine Tabelle mit (eigentlich) kontinuierlich steigenden Werten - das ist aber leider kein Autoinc-Wert da dieser verändert werden soll.
Nun ist es leider so, dass sich durch eben dieses verändern, 'Lücken' eingeschlichen haben.
Eigentlich sollte es wie folgt aussehen:
1,2,3,4,5.....
es sieht aber so aus
1,5,10,23,.....
Nun habe ich folgendes Script zusammen gebastelt:
$sql = "SELECT * FROM hb_galeries ORDER BY count ASC;";
$result = mysql_query($sql);
$i = 1;
while ($qarray = mysql_fetch_array($result)) {
$new_sql = "UPDATE hb_galeries SET count = $i WHERE count = $qarray[count];";
echo $new_sql . "<br>";
mysql_query($new_sql);
$i = $i + 1;
}
Funktioniert. Aber nun ist mein Anliegen: Kann man das nur als SQL-Query schreiben. Ich bin leider nicht so firm in der Kombination verschiedener Abfragen (JOINS usw.)
Hello,
wie dein Code dir schon gezeigt hast benötigst du eine Schleifenlogik. Ein einfaches Statement hilft dir nicht weiter. Ja, man kann diese Schleifenlogik in der Datenbank ablegen und zwar in Form einer Stored Procedure - es dürfte aber wenig Vorteile bieten, um nicht zu sagen keinen.
Generell sei dir aber nahe gelegt dein Vorhaben zu überdenken. Eine ID dient ausschließlich der Identifikation von Datensätzen. IDs müssen nicht lückenlos sein, IDs haben auch sonst keine Funktion, IDs sind lediglich eindeutig. Um mich da mal selbst zu zitieren: du änderst nicht dein Nummernschild, nur weil du dein Auto auf der anderen Straßenseite parken willst.
MfG
Rouven
Seid gegrüßt!
Generell sei dir aber nahe gelegt dein Vorhaben zu überdenken. Eine ID dient ausschließlich der Identifikation von Datensätzen. IDs müssen nicht lückenlos sein, IDs haben auch sonst keine Funktion, IDs sind lediglich eindeutig.
Erstmal vielen Dank. Ich weiß eine ID muss nicht lückenlos sein. Allerdings ist dies nicht die ID. eine ID haben die Datensätze auch. Es soll eher eine Art Sortierung repräsentieren. Eine Manuelle Sortierung. Auch hier müssen die Werte nicht lückenlos sein. Allerdings führt das zu Verwirrung wenn man denn die Sortierung ändern will, z.B. einen Datensatz weiter rücken.
Hierzu hätte ich dann auch mal eine paar Fragen bzgl. Anregungen.
Wenn ich eine Datensatz verschieben möchte, verschiebe ich erst alle Datensätze nach dem betreffenden Ziel um einen Zähler und ändere dann den Zähler des zu verschiebenden Datensatz auf das Ziel. Ist dieses Vorgehen so richtig? (Ich hoffe ich konnte mich nachvollziehbar ausdrücken ;-))
Hello,
Wenn ich eine Datensatz verschieben möchte, verschiebe ich erst alle Datensätze nach dem betreffenden Ziel um einen Zähler und ändere dann den Zähler des zu verschiebenden Datensatz auf das Ziel. Ist dieses Vorgehen so richtig?
vermutlich, aber stelle dabei sicher, dass deine Anwendung einen sauberen Transaktionskontext wahrt, sonst könnten sich verschiedene Operationen gegenseitig in die Queere kommen.
MfG
Rouven
Seid gegrüßt!
Wenn ich eine Datensatz verschieben möchte, verschiebe ich erst alle Datensätze nach dem betreffenden Ziel um einen Zähler und ändere dann den Zähler des zu verschiebenden Datensatz auf das Ziel. Ist dieses Vorgehen so richtig?
vermutlich, aber stelle dabei sicher, dass deine Anwendung einen sauberen Transaktionskontext wahrt, sonst könnten sich verschiedene Operationen gegenseitig in die Queere kommen.
OK. Aber wie könnte ich das bei mySQL lösen? Ich habe mir mal sagen lassen (muss aber auch nicht stimmen), dass das durch eine bestimmte Tabellen-Art (myisam?) geklärt werden könnte. Stimmt das? Falls ja, welche Tabellenart wäre das?
Mal ein konstruiertes Szenario:
alle Datensätze sind der Reihe nach nummeriert / soritiert:
1,2,3,4,5......
a) Ich möchte jetzt Datensatz 5 nach 16 verschieben. Dabei aber
b) die jetzt entstandene Lücke bei 5 schließen und
c) nicht Datensatz 16 überschrieben sonder auf Platz 17 verschieben und alle folgenden auch um eins nach hinten.
Also habe ich folgende SQls:
erst c) UPDATE table SET count = count + 1 WHERE count >= 16
dann a) UPDATE table SET count = 16 WHERE count = 5
dann b) UPDATE table SET count = count - 1 WHERE count >= 5
Ist das so richtig?