phase: Reihenfolge ändern?

hi,
ich habe ein cms für eine navigation gebaut. jetzt würde ich gern die reihenfolge der links beliebig ändern können.
leider habe ich kein plan wie ich das anstellen soll.
bitte keine ratschläge, die in die richtung gehen:
"...ein feld in die db nach dem sortiert wird".
das prinzip ist mir klar aber wenn ich ein feld in der db haben nach dem sortiert wird, wir stelle ich es an das alle einträge angepass werden wenn ich einen ändere. also wenn ich einen eintrag weiter nach unten bzw. oben verschiebe, dann müssen alle anderen einträge ja automatisch dem entsprechend einen rauf oder runter geschoben werden, klar?

wenn meine tabelle zb. so aussieht:
+---------+------+
| name    | sort |
+---------+------+
| Karin   |    1 |
| Heidi   |    2 |
| Andreas |    3 |
| Josef   |    4 |
+---------+------+

und jetzt will ich Andreas an 1. stelle haben. wie würde dann das mysql-statement aussehen?
und wie verändern sich dann die anderen werte automatisch?
kann mir einer einen brauchbaren tipp geben?

dank+gruß
phase

  1. Hallo phase,

    und jetzt will ich Andreas an 1. stelle haben. wie würde dann das mysql-statement aussehen?
    und wie verändern sich dann die anderen werte automatisch?

    wenn ich das richtig verstanden habe, willst du lediglich 'Andreas' nach oben schieben, die anderen aber so lassen, wie sie sind, ja? Soweit ich weiß geht das nicht, du kannst nur nach bestimmten Spalten sortieren (in deinem Fall würde dir ein 'ORDER BY name' Andreas nach oben befördern - allerdings würde 'Karin' dann ganz unten landen.

    kann mir einer einen brauchbaren tipp geben?

    mhh... was verstehst du unter einem brauchbaren Tipp?

    Grüße aus Nürnberg
    Tobias

    1. Hallo phase,

      hallo tobias,

      und jetzt will ich Andreas an 1. stelle haben. wie würde dann das mysql-statement aussehen?
      und wie verändern sich dann die anderen werte automatisch?
      wenn ich das richtig verstanden habe, willst du lediglich 'Andreas' nach oben schieben, die anderen aber so lassen, wie sie sind, ja?

      nein, nihct ganz. ich möchte andrea nihct unbedingt ganz nach oben sondern nur eine position nach oben.

      Soweit ich weiß geht das nicht, du kannst nur nach bestimmten Spalten sortieren (in deinem Fall würde dir ein 'ORDER BY name' Andreas nach oben befördern - allerdings würde 'Karin' dann ganz unten landen.

      das ist genau das, was ich nicht will.

      kann mir einer einen brauchbaren tipp geben?
      mhh... was verstehst du unter einem brauchbaren Tipp?

      ein tipp den ich in die praxis umsetzen kann  ;-)

      also vielleicht hab ich mich auch nicht klar ausgedrückt.
      ich möchte nicht nur eine sortierte ausgabe haben, sondern die einträge in der db neu sortieren. wenn ich jetzt einen neunen link in meine navigation einfüge steht der halt entweder ganz oben oder ganz unten oder halt alphabetisch usw. - je nach dem wie ich sortiere.

      ich möchte aber angeben können an welcher position er stehen soll. aslo eine spalte in der db nach der sortiert wird. diese spalte möchte ich aber nach belieben updaten können und zwar so, das sich alle einträge entsprechend verschieben - sowas muss doch möglich sein.

      danke
      phase

  2. Hallo!

    wenn meine tabelle zb. so aussieht:
    +---------+------+
    | name    | sort | id
    +---------+------+
    | Karin   |    1 | 7
    | Heidi   |    2 | 6
    | Andreas |    3 | 10
    | Josef   |    4 | 3
    +---------+------+

    und jetzt will ich Andreas an 1. stelle haben. wie würde dann das mysql-statement aussehen?

    Mit nur einem SQL-Statement geht das nicht. Der Tabelle sollte noch eine weite Spalte mit eine ID für jeden Datensatz bekommen, die Auto-Increment ist. Ich habe das mal in Deinem Beispiel eingefügt. Die benötigt man, um sich auf den Datensatz zu beziehen. Ich nehme mal an, die Tabelle hat 10 Datensätze.

    Andreas -> 1
    ============== Datensatz bekommt kleinere sort-Nr. ====================
    1. UPDATE tabelle SET sort=sort+1 WHERE sort>=1 AND sort<3;
    2. UPDATE tabelle SET sort=1 WHERE id=10;

    zu 1
    ==>> Wenn Datensatz eine kleinere sort-Nr. bekommen soll.
    Alle sort-Nr. bis zur 3 werden um eins erhöht.
    -> 1 wird zu 2
    -> 2 wird zu 3
    -> 4 bleibt 4
    -> usw.

    zu 2.
    Dem Datensatz wird die sort-Nr. 1 "zugeteilt".

    Andreas -> 7
    ============== Datensatz bekommt höhere sort-Nr. ====================
    1. UPDATE tabelle SET sort=sort-1 WHERE sort>3 AND sort<=7;
    2. UPDATE tabelle SET sort=7 WHERE id=10;
    zu 1
    ==>> Wenn Datensatz eine höhere sort-Nr. bekommen soll.

    • Andreas soll von 3 auf 7
      -> 1 bleibt
      -> 2 bleibt
      -> 3 wird nicht berührt
      -> 4 wird zu 3
      -> 5 wird zu 4
      -> 6 wird zu 5
      -> 7 wird zu 6
      -> 8 bleibt 8
      -> usw.

    zu 2.
    Dem Datensatz wird die sort-Nr. 7 "zugeteilt".

    Bei diesem Beispiel muß Du natürlich testen, ob man den Platz vergeben kann. Keine Ahnung ob das gut geht, wenn man einem Datensatz die sort-Nr. 21 gibt, wenn man nur 10 Datensätze hat. Ich meine, daß müßte schief gehen. Die nachfolgenden Sortieren, wenn eine höhere sort-Nr. vergeben wird, stimmen dann nicht ganz. Müßte man testen, bin mir nicht ganz sicher.

    MfG, André Laugks

    --
    L-Andre @ gmx.de
    1. ==>> Wenn Datensatz eine höhere sort-Nr. bekommen soll.

      • Andreas soll von 3 auf 7

      Das habe ich vergessen zu löschen!

      MfG, André Laugks

      --
      L-Andre @ gmx.de
    2. hallo André,

      danke erst einmal für deine antwort. hab aber habe selbst schon eine lösung gefunden und sooo schwer war das ja eigentlich gar nicht - weiss gar nicht warum da keiner von euch drauf gekommen ist ;o)

      also ich vertausche jetzt einfach nur zwei werte. und zwar den, den ich nach unten bzw oben setzten will mit dem, der darübe bzw darunter sitzt.

      deine variante ist vielleicht etwas komfortabler wenn wenn die einträge an eine bestimmte stelle setzte will, aber das muss ich gar nicht.

      danke
      phase

      1. Hallo!

        also ich vertausche jetzt einfach nur zwei werte. und zwar den, den ich nach unten bzw oben setzten will mit dem, der darübe bzw darunter sitzt.

        Das ist eine andere Art die werte zu vertauschen. Man läßt also den Wert wandern.

        deine variante ist vielleicht etwas komfortabler wenn wenn die einträge an eine bestimmte stelle setzte will, aber das muss ich gar nicht.

        Ähhhmmmm, das war Deine Frage!

        MfG, André Laugks

        --
        L-Andre @ gmx.de