Olaf Heinrich: PHP / MySQL Datensatz "vertauschen"

Hallo zusammen,

nachdem ich bei Google nur Codeschnipsel gefunden habe mit denen ich ncihts anfangen kann,m versuche ich mein Problem mal in diesem Forum zu lösen.

Folgende Ausgangssituation. In einer Tabelle mit dem NAmen "tbl_projekte" sind Datensätze gespeichert. Diese werden mit dem Primärschlüssel "prj_ID" indentifiziert und über die Spalte "prj_SortID" sortiert ausgegeben. Eben der Sortierreihenfolge ihrer Positionen.
Beispiel:

prj_ID | prj_SortID | prj_Head
5      |    3       | Datensatz 10...
4      |    4       | Datensatz XY...
9      |    5       | Noch ein Datensatz...

Nun möchte ich den Datensatz mit der prj_ID 4, also auf der aktuellen Position 4 um mit dem Datendatz prj_ID 5 vertauschen. Das sich diese Sortierung bei der Ausgabe ergibt:

prj_ID | prj_SortID | prj_Head
4      |    4       | Datensatz XY...
5      |    3       | Datensatz 10...
9      |    5       | Noch ein Datensatz...

Soweit klar? Gut, denn mir ist der Weg dahin nicht klar. Es geht über die MySQL Anweisung "UPDATE". Schon klar. Wenn da jemand ein Codebeispiel für mich hätte, wäre ich dankbar, denn Codeschnipsel habe ich reichlich gefunden, nur leider irgendwie steige ich durch diese nicht durch, weil sie immer nur Bruchteile von Informationen enthalten.

Lieben Dank schon mal im Voraus,
Olli

  1. prj_ID | prj_SortID | prj_Head
    5      |    3       | Datensatz 10...
    4      |    4       | Datensatz XY...
    9      |    5       | Noch ein Datensatz...

    Nun möchte ich den Datensatz mit der prj_ID 4, also auf der aktuellen Position 4 um mit dem Datendatz prj_ID 5 vertauschen. Das sich diese Sortierung bei der Ausgabe ergibt:

    prj_ID | prj_SortID | prj_Head
    4      |    4       | Datensatz XY...
    5      |    3       | Datensatz 10...
    9      |    5       | Noch ein Datensatz...

    Soweit klar? Gut, denn mir ist der Weg dahin nicht klar. Es geht über die MySQL Anweisung "UPDATE". Schon klar. Wenn da jemand ein Codebeispiel für mich hätte, wäre ich dankbar, denn Codeschnipsel habe ich reichlich gefunden, nur leider irgendwie steige ich durch diese nicht durch, weil sie immer nur Bruchteile von Informationen enthalten.

    ich sags mal so - dein im beispiel beschriebenes vorhaben scheint sinnfrei zu sein (beide tabellenbeispiele enthalten absolut identische datensätze), da du nur die sortierreihenfolge innerhalb der tabelle (datenbankintern) beeinflusst, diese ist aber völlig irrelevant (egal wie du argumentierst), relevant ist lediglich die ausgabe - und diese ist mit ORDER BY problemlos beeinflussbar

    imho wäre sinnvoll wäre zb die prj_SortID der beiden datensätze zu tauschen

    1. imho wäre sinnvoll wäre zb die prj_SortID der beiden datensätze zu tauschen

      genau und zwar, wie du schon richtig erkannt hast mit UPDATE.

      Ausnahmsweise:
      UPDATE tbl\_projekte SET prj\_SortID=4 WHERE prj\_ID=5;
      UPDATE tbl\_projekte SET prj\_SortID=3 WHERE prj\_ID=4;

      1. Hello,

        imho wäre sinnvoll wäre zb die prj_SortID der beiden datensätze zu tauschen

        genau und zwar, wie du schon richtig erkannt hast mit UPDATE.

        Ausnahmsweise:
        UPDATE tbl\_projekte SET prj\_SortID=4 WHERE prj\_ID=5;
        UPDATE tbl\_projekte SET prj\_SortID=3 WHERE prj\_ID=4;

        Ist Dir aufgefallen, dass Du nun die ganze Sortierung durcheinander gebracht hast? ;-)

        Ein Tausch mit zwei Statements funktioniert nur sicher, wenn

        • man die Tabelle für die Gesamtdauer der Operation sperrt,
            oder zumindest die beiden betroffenen Datensätze
        • Man eine Hilfsgröße zur Verfügung hat, wie z.B. die ID

        Die ID hast Du benutzt...

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  2. Hello,

    prj_ID | prj_SortID | prj_Head
    4      |    4       | Datensatz XY...
    5      |    3       | Datensatz 10...
    9      |    5       | Noch ein Datensatz...

    Wichtig ist nur, dies in einem Statement zu schaffen, damit keine Konsitenzlücke entsteht.

    update tbl_projekte set prj_SortId = if(prj_SortId=5,4,5) where prj_sortid in (4,5);

    oder es gibt auch noch einen Ansatz mit einer Rechnung:

    update tbl_projekte set prj_SortId = (4+5)-prj_SortId where prj_sortid in (4,5);

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de