Daten nach bestimmter Reihenfolge sortieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Daten nach bestimmter Reihenfolge sortieren

    Hi,

    ich bohr gerade unser GalleryScript ein wenig auf. Nun habe ich das Problem das die Bilder beliebig in einem Album sortiert werden sollen und bin am überlegen wie ich das wohl am geschicktesten anstelle.

    1. Idee:
    Ich gebe jedem Bild eine Position per Integer mit (Bild1, pos 20) und sortiere bei der Ausgabe danach (ORDER BY pos)

    Problem: Wenn nun ein Bild umsortiert wird, muss ich jedes Bild anpacken und mit neuer Position updaten...

    2. Idee
    Ich speichere kommagetrennt die Reihenfolge der ID's der Bilder im zugehörigen Album. (order = '1,4,2,8'). Beim selecten der Bilder könnte ich dann danach ordern.

    SELECT * FROM tab ORDER BY id!=1, id!=4, id!=2, id!=8

    Problem: Wenn viele Bilder in einem Album sind wird das ganze ziemlich unübersichtlich und evtl inperformant. Ausserdem nehme ich mir die Möglichkeit das Album inklusive Bilder in einem Rutsch sortiert zu selecten.


    Bisher liebäugle ich mit der 2ten Idee. Hat jemand von euch noch ne besser Idee wie ich das gaze möglichst Elegant lösen könnte?

    danke...

  • #2
    hier einmal ein textbeispiel zum lösen deines problems ....

    beispiel zum verschieben eines bildes nach ganz oben (in der sortierung)
    • aktuelle postion merken
    • für alle bilder, welche kleiner der aktuellen position sind, die positionierung +1 setzen. (geht mit nur einer query)
    • das aktuell zu verschiebende bild auf pos=1 setzen.
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Problem: Wenn nun ein Bild umsortiert wird, muss ich jedes Bild anpacken und mit neuer Position updaten...
      nein mußt du nicht, sondern nur die, die von der änderung selber betroffen sind. beispiel:

      bild 1, pos 20
      bild 2, pos 40
      bild 3, pos 60
      bild 4, pos 80

      jetzt schiebst du bild 4 vor bild 2, also müßte bild 1 nicht geändert werden. ich habe das mal mit javascript umgesetzt, du bekommst eine liste mit einem pfeil rauf und einem runter. damit änderst du position und schreibst gleichzeitig den wert in ein verstecktes feld. wenn du dann die neue reihenfolge abspeichern willst, mußt nur die bilder anpacken, die einen eintrag im versteckten positionsfeld haben. hoffe das war verständlich

      gruß
      peter
      Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
      Meine Seite

      Kommentar


      • #4
        Ok, das hört sich doch schonmal nicht schlecht an.

        Das Speichern ist in dem Fall nur leider ein anderes Problem. Ich sortiere die Bilder per Drag&Drop und würde dann das "Sortierergebnis" abspeichern wollen. D.h. ich habe eine Liste mit ID's die die Reihenfolge repräsentiert.
        Dann müsste ich ja erst wieder die Position aller Bilder auslesen, pro Bild vergleichen und die entsprechende Aktion ausführen.

        Wenn es mir jeweils immer nur um ein Bilder ginge wäre deine Lösung denke ich sehr gut (auch wenn ich gedanklich noch nicht drauf komme wie ich Bilder an 3te Position packe).

        Ein anderes Problem das ich habe ist beim hintufügen der Bilder. Momentan benutze ich noch Ansatz 1 - wenn ich nun ein Bild hinzufüge muss es ja max(pos) +x bekommen. Geht das auch mit einer Query? (Illegal user of group function etc.)

        //Edit@kropff
        Ich benutze, wie schon erwähnt, drag&drop mit einer Liste. D.h. beum submit zum speichern der Reihenfolge würde ich die Reihenfolge der LI's auslesen und damit meine neue Reihenfolge haben.

        Kommentar


        • #5
          ob nun drag&drop oder mit rauf-runter-klicken ist eigentlich lattens. wenn du die bilder alle untereinander packst, geht das mit positionsangaben ganz hervorragend. wenn die aber auch nebeneinander stehen, hast du recht.

          gruß
          peter
          Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
          Meine Seite

          Kommentar


          • #6
            Der Punkt ist, das der User ja auch beliebig hin und her schieben kann, d.h. er hat vielleicht nur ein Bilder wirklich verschoben aber alle schon angepackt.

            Ob drag&drop oder auf buttons drücke is wurscht. da haste recht. Is einfach nen UL mit LI float:left.

            Kommentar


            • #7
              Der Punkt ist, das der User ja auch beliebig hin und her schieben kann, d.h. er hat vielleicht nur ein Bilder wirklich verschoben aber alle schon angepackt.
              dann arbeite mit zwei versteckten feldern, eines mit dem original-wert eines mit dem neuen wert, der bei änderungen eingetragen wird, dann kanst du überprüfen, was sich wirklich geändert hat.

              gruß
              peter
              Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
              Meine Seite

              Kommentar


              • #8
                Ok, und wie mach ich es wenn mehr als ein Bild "verschoben" wurde?

                Theoretisch muss ich ja dann die Update Sache pro Bild einmal machen, oder?

                Kommentar


                • #9
                  also, du hast eine reihenfolge bei bildern (wie auch immer die aussieht). die speicherst du in einem hidden-feld. wenn der user nun per drag&drop die bilder neu anordnet, trägts du den neuen rang in ein zweites hidden-feld ein. bevor die änderungen gespeichert werden, prüfst du per php ob sich original- und neuwert voneinander unterscheiden. wenn nicht, schön, wenn ja update mit neuem wert.

                  gruß
                  peter
                  Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                  Meine Seite

                  Kommentar


                  • #10
                    Soweit so klar

                    original Reihenfolge: 1,4,2,8
                    nach drag&drop: 2,8,4,1

                    1. Vergleiche Reihenfolge (org und new)
                    2. Setze ID 2 an pos 1
                    3. Setze ID 8 an pos 2
                    4. Setze ID 4 an pos 3
                    5. Setze ID 1 an pos 4

                    Oder wie hattest du gedacht?

                    Kommentar


                    • #11
                      genau, oder dann auch sowas

                      original Reihenfolge: 1,4,2,8
                      nach drag&drop: 1,4,8,2

                      1. Vergleiche Reihenfolge (org und new)
                      2. Setze ID 2 an pos 4
                      3. Setze ID 8 an pos 3

                      gruß
                      peter
                      Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                      Meine Seite

                      Kommentar


                      • #12
                        Ja, ok - es ginge so. Aber dann muss ich die Update Query in ner Schleife machen und das behagt mir garnicht. Wenn das ein Album mit 80 Bildern ist macht das keinen Spaß denk ich.

                        Da gefällt mir Möglichkeit 2 bis jetzt wirklich besser. Weil das nur eine Query zum updaten ist und beim auslesen kann ich die Query halt zusammenbauen - auch wenn ich dann halt nicht mehr Sortieren kann wenn ich die Alben inklusive Bilder auslese (join).

                        Habt ihr vielleicht sonst noch ne Idee?

                        Kommentar


                        • #13
                          Wenn das ein Album mit 80 Bildern ist macht das keinen Spaß denk ich.
                          ich habe sowas mal für einen online-shop gemacht, klappte sehr gut und war auch performant. gut, das ganze lief auf einem root-server.

                          gruß
                          peter
                          Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                          Meine Seite

                          Kommentar


                          • #14
                            Ich halte das mal als Lösung im Hinterkopf. Schlecht ist es ja nicht, aber es muss doch noch etwas besseres geben.

                            Ich könnte ja auch beim Update Ordern wie ich es in Methode2 vorgeschlagen habe - das Problem ist nur, wie update ich pos = lastpos+10; lastpos=pos?

                            Kommentar


                            • #15
                              Gelöst, mit einer Query

                              PHP-Code:
                              SET @pos := 0;

                              UPDATE tab1 

                              SET position 
                              = (SELECT @pos := @pos +1

                              WHERE 
                              album_id 
                              AND 
                              user_id 

                              ORDER BY 
                              id
                              !=1,
                              id!=4,
                              id!=2,
                              id!=
                              Damit wird die Reihenfolge der Bilder festgelegt und ich kann noch weiterhin über die Alben alle Bilder entsprechend der Position mit selecten (join).


                              Falls jemand noch ne bessere Idee hat, her damit

                              Ansonsten auf jeden Fall schonmal viele Dank.

                              Kommentar

                              Lädt...
                              X