Announcement

Collapse
No announcement yet.

position von zwei datensätzen "vertauschen"

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • position von zwei datensätzen "vertauschen"

    Hallo,

    ich habe ein Tabelle mit Daten, die auch eine Positionsspalte besitzt, nach der die Ausgabe angeordnet wird.

    Bsp:
    Code:
    id | tier | position
    1 Hund 1
    2 Katze 2
    3 Hase 3
    4 Schwein 4
    Nun soll Schwein um eins nach oben verschoben werden, so muss die Position von Hase um eines erhöht, die von Schwein um eines erniedrigt werden.

    Bekannt ist nur die id von Schwein.

    Ich dachte mir folgendes, was jedoch nicht erlaubt ist - liegt wohl an meinen begrenzten MySQL-Kenntnissen (PHP):

    Code:
    # erhöhe position um 1 (nach unten verschieben) beim vorgänger, der durch position - 1 bestimmt wird ; voraussetzung: schwein ist nicht bereits an position 1
    UPDATE IF(SELECT position FROM tierliste WHERE id = $schwein_id > 1) tierliste
    SET position = position + 1 
    WHERE position = (SELECT position - 1 FROM tierliste WHERE id = $schwein_id);
    
    # erniedrige entsprechend das schwein nach bekannter id
    UPDATE tierliste SET position = position - 1 WHERE id = $schwein_id;
    Die zweite Abfrage funktioniert, aber mit der ersten habe ich noch so meine MySQL-Artigen-Denk-Probleme...

    Wer weiß Rat?

  • #2
    Hallo,

    warum nicht einfach:
    [highlight=sql]
    UPDATE tierliste
    SET position = position + 1
    WHERE position = (SELECT position - 1 FROM tierliste WHERE id = $schwein_id);
    [/highlight]

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hatte ich vorerst auch mal vor, aber das ist schon nicht erlaubt.

      SQL Error: you can't specifiy target table 'tierliste' for update in FORM clause
      :-/

      Comment


      • #4
        Hi, erniedrige zunächst das Schwein mit Deinem Befehl:

        UPDATE tierliste SET position = position - 1 WHERE id = $schwein_id;

        Jetz haben Schwein und Hase diesselbe Position.

        Dann suche Dir die Hase_id mit:

        select tierliste.id from tierliste where Tierliste.postion=
        (select t.position from tierliste t where t.id=$schwein_id)
        and tierliste.id <> $schwein_id

        dann kannst Du Hase erhöhen:

        UPDATE tierliste SET position = position + 1 WHERE id = $hase_id;

        Gruß
        docendo discimus

        Comment


        • #5
          Danke, so klappt es!

          Dachte eigentlich erst, dass es üblich sei, möglichst alles gleich in einer abfrage zu machen [Verschachtelung], hatte dadurch umso mehr Probleme bei der Lösungsfindung.

          Comment


          • #6
            Hallo,
            Originally posted by eishand View Post
            Hatte ich vorerst auch mal vor, aber das ist schon nicht erlaubt.
            ...
            Stimmt, MySQL kann nicht mit SELECT auf die gerade in einem DML-Statement geänderte Tabelle zugreifen. Da war ich mit meiner Lösung wohl etwas zu optimistisch .

            Originally posted by eishand View Post
            ...Dachte eigentlich erst, dass es üblich sei, möglichst alles gleich in einer abfrage zu machen [Verschachtelung], hatte dadurch umso mehr Probleme bei der Lösungsfindung.
            Das ist es auch! Was der SQL-Server in einem Durchgang erledigen kann ist i.a.R. performanter als die Aufsplittung in mehrere Teile in der Applikation. Das dies hier nicht geht ist der "Unzulänglichkeit" von MySQL geschuldet .

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Originally posted by Falk Prüfer View Post
              Hallo,

              Stimmt, MySQL kann nicht mit SELECT auf die gerade in einem DML-Statement geänderte Tabelle zugreifen. Da war ich mit meiner Lösung wohl etwas zu optimistisch .


              Das ist es auch! Was der SQL-Server in einem Durchgang erledigen kann ist i.a.R. performanter als die Aufsplittung in mehrere Teile in der Applikation. Das dies hier nicht geht ist der "Unzulänglichkeit" von MySQL geschuldet .

              Gruß Falk
              Dann war zumindest mein Bemühen schon mal ok.

              Rein interessehalber - welche (erschwinglichen) SQL-Datenbanken hätten dies z.B. unterstützt?
              PostgreSQL? Firebird?

              Gruß

              eishand

              Comment


              • #8
                Postgres auf jeden Fall. Oracle (XE) natürlich auch. Evtl. auch mysql in einer 5er Version.

                Dim
                Zitat Tom Kyte:
                I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                Comment

                Working...
                X