Verständnisfrage: Techniken zur Ausgabereihenfolge

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

  • Verständnisfrage: Techniken zur Ausgabereihenfolge

    Liebe Gemeinde,

    ich habe eine Denkblockade und hab schon versucht hier zu suchen, aber ich denke ich habe eine so banale Frage das ich wahrscheinlich nach den falschen Keywords suche und google.

    Die Frage, wie kann ich die Reihenfolge einer mysql ergebnistabelle manuell bestimmen.

    Ich mache kurz ein Beispiel:
    Ich möchte in meinem eigenen Webshopsystem einige Artikel vor andere Stellen, und das eigentlich sehr komfortabel gestalten.

    Ich habe nun z.B. eine Tabelle bestehend aus "id","artikelname","preis" und dem Feld "order"

    bisher habe ich manuell in das Feld order eine Zahl geschrieben von 1-1000 und dann ein SELECT FROM `artikel` ORDER BY `order` ASC o. DESC gemacht.

    in meiner Administration habe ich eine kleine php-function die bei klick auf "nach oben" den wert `order` um 1 verkleinert oder vice versa vergrössert.

    und da liegt der Hundbegraben, irgendwann mal hat man das volle chaos da viele Einträge die gleiche Nummer haben. nun muss man 3-4 mal auf das "nach oben" klicken bis man das Ziel erreicht, also der eine Eintrag vor allen anderen ist etc.

    Ich habe mir auch schon Gedanken gemacht mit Grösseren Zahlen zu arbeiten, bzw die Fortlaufende id ( z.B. 135 ) + 1000 zu nehmen und dann mit +- 100 zu arbeiten, dann hat man wenigstens nicht mehr die identischen Einträge im meinem Feld `order`.

    Hat mir jemand einen Denkansatz? Mir geht es in erster Linie ums Verständnis. Wie machen dass denn andere Shops bzw Blogs oder so.

    Da gibts bestimmt nen gaaaanz einfachen Trick.

    Vielen Dank.

    Andre der Strassencoder

  • #2
    Normalerweise ordnet man nur nach Datum, Titel oder Autor, das ist ja mit SQL einfach zu bewerkstelligen. Wenn du manuelle sortieren willst wäre es am sinnvollsten beim verschieben alle anderen Einträge auch zu ändern. Einen ähnlichen (nur noch komplexeren) Ansatz verfolgen Nested Sets, hier gehts um eine Anordnung in mehreren Dimensionen, informier dich mal darüber.

    Du müsstest also wenn du einen Eintrag verschiebst alle Eintrag darunter auch verschieben:
    Code:
    UPDATE TABLE entries SET order + 1 WHERE order < 15
    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

    Kommentar


    • #3
      Hallo,

      zuerst solltest du bei deiner nachOben-Funktion halt noch darauf achten dass der Order-Wert des Datensatzes der vorher an der Stelle war um 1 erhöht wird. Außerdem solltest du ggf. auch drauf achten, dass der Wert in Order nicht in den Minus-Bereich wandern kann (nachOben-Klick beim ersten Produkt nicht mehr anzeigen und auch PHP-Seitig verhindern dass das geschieht).

      Zur Sicherheit könntest du (z.B. per Cronjob) regelmässig ein Script laufen lassen, dass alle Datensätze nach Order sortiert ausliest und ein Update fährt, dass die Sortierung komplett neu von 1 beginnend schreibt.
      Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
      Schön - etwas Geschichte kann ja nicht schaden.
      Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

      Kommentar


      • #4
        Original geschrieben von tontechniker
        Du müsstest also wenn du einen Eintrag verschiebst alle Eintrag darunter auch verschieben:
        Code:
        UPDATE TABLE entries SET order + 1 WHERE order < 15
        Wieso das? Wenn ich in der Sortierten Liste ein bestimmtes Element um eine Position nach oben bringen will, dann werden eigentlich nur die Positionen des nach oben zu bringenden Elements und dem dass davor die Platzierung inne hatte getauscht. Eigentlich keine große Sache...

        Oder versteh ich da grad was falsch

        Etwas besser muss man erst aufpassen, wenn man ein Element um z.B. 5 Positionen nach oben haben will - dann muss man halt die Sortierung der 5 Elemente die zuvor darüber waren neu schreiben.
        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
        Schön - etwas Geschichte kann ja nicht schaden.
        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

        Kommentar


        • #5
          Original geschrieben von Quetschi
          Außerdem solltest du ggf. auch drauf achten, dass der Wert in Order nicht in den Minus-Bereich wandern kann
          Das sollte eigentlich für ein reines Sortierfeld überhaupt kein Problem sein.
          Gruss
          H2O

          Kommentar


          • #6
            - dem Feld order einen anderen Namen geben
            - beim "hochsetzen" des Eintrags den Eintrag mit dem nächsthöheren Wert updaten und ihm den alten des hochzusetzenden Eintrags geben
            - den Wert des hochzusetzenden Eintrags um 1 inkrementieren

            So würde ich es machen. Beim heruntersetzen eben andersrum.
            [FONT="Helvetica"]twitter.com/unset[/FONT]

            Shitstorm Podcast – Wöchentliches Auskotzen

            Kommentar


            • #7
              Original geschrieben von H2O
              Das sollte eigentlich für ein reines Sortierfeld überhaupt kein Problem sein.
              Meinst du weil ein Sortierfeld unsigned sein sollte? Ansonsten ist es halt so, dass ungeduldige User vielleicht 2 oder 3mal auf den nachOben-Link drücken wenn der Webserver nicht gleich in der nächsten zehntel-Sekunde die neu sortierte Liste ausspuckt.
              Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
              Schön - etwas Geschichte kann ja nicht schaden.
              Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

              Kommentar


              • #8
                Hallo Tontechniker,

                genau davor habe ich irgendwie Angst, alle anderen Einträge auch zu ändern, da der Shop von im Moment 200 Artikel auf sagen wir mal 20000 evtl gehen soll, dann könnte ich in einem ungünstigen Fall 800 Einträge ändern da ich den 801 Artikel ganz vorne haben will.

                Was sagt da die DB-Performance.

                Ich weiß das klinkt komisch, aber kann da was passieren / steckenbleiben / irreparabel beschädigt werden wenn ich so einen Query wie
                PHP-Code:
                UPDATE TABLE entries SET order 1 WHERE order 15 
                jedesmal ausführe wenn ich auf `nach oben` klicke oder muss ich mir da keine Gedanken machen.

                Hmm.... Nestes sets, da google ich mal ...

                Klar kann ich nach Datum, Author, Titel etc sortieren, macht aber leider bei mir keinen Sinn, in meinem Webshop will ich wenn z.B. eine Ausverkaufsaktion ist, die 6 Top-Seller ganz nach vorne, und den Rest neu sortieren, so ein bisschen Verkaufspsychologie anwenden.

                An Quetschi - das ist eine gute Idee, einen Cron job laufen lassen der mir quasi das Feld `order` dann neu strickt. Hmmm...

                ich bin auch immernoch am überlegen meiner 1000er Schritte idee bzw dann 100000 Schritte idee, da ich ja dann wenn ich die unique `id` + 100000 nehm und dann statt +-1 eben +-1000 nehme dann habe so gut wie nie den selben wert. Geht dann halt so ausm stehgreif glaub nur bei 999 Einträgen gut

                Das verhindern negativer Einträge habe ich schon gemacht, bzw am eigen Leib spüren müssen... Das Problem mit dem nächsten Eintrag um einen Zähler erhöhen habe ich schon, da ich mir dann ja evtl die nächste dublette schaffe. Da kommt Tontechnikers Ansatz alle Einträge zu ändern ins Spiel.

                Nunja im Moment ist das Problem eben die Dubletten, Quadretten etc ich habe halt 20x order=9 , 7x order = 19 etc.

                Vielen Dank für die Antworten bisher.

                Ich denke mit eurer Hilfe wird der Denkprozess wesentlcih vereinfacht.

                Grüsse von Andre dem Strassencoder


                NACHTRAG:
                Huch während ich schrieb kamen noch mehr Antworten...

                Mir fällt da aber noch was anderes ein. da ich ja alle Artikel in der gleichen Tabelle habe, aber nur die brauche die in der gleichen Warengruppe sind, wirds mit ner "allgemeinen" Update anweisung schwieriger.

                Andere Frage: Ich habe irgendwie sowas wie "Sortierfeld" gelesen.
                kann eine neue Tabelle evtl helfen, also quasi eine Sortiertabelle für meine Artikeltabelle, oder macht das keinen Unterschied, denn in meiner Sortiertabelle habe ich ja nur 3 Felder ( id, artikelid und order)....
                Zuletzt geändert von strassencoder; 02.04.2008, 16:58.

                Kommentar


                • #9
                  Original geschrieben von strassencoder
                  An Quetschi - das ist eine gute Idee, einen Cron job laufen lassen der mir quasi das Feld `order` dann neu strickt. Hmmm...
                  Also das solltest du erstmal machen, wenn die Sortierung schon "Lücken" hat oder bestimmte "Sortiernummern" schon doppelt vergeben sind. Ansonsten ist es halt nur für den Fall gedacht, dass aus welchen Gründen auch immer, sich mal ebensolche Fehler in die Sortierspalte einschleichen.

                  Ansonsten hat es @unset knackig kurz und gut beschrieben wie es gemacht werden sollte - meins weiter oben war halt die längere Ausführung dazu.

                  So und nicht anders würd ich sowas machen.
                  Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                  Schön - etwas Geschichte kann ja nicht schaden.
                  Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                  Kommentar


                  • #10
                    Wie gesagt - das Codebeispiel von tontechniker hab ich ned ganz verstanden Vielleicht kann er dazu nochmal kurz was sagen, wie das gedacht ist?
                    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                    Schön - etwas Geschichte kann ja nicht schaden.
                    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                    Kommentar


                    • #11
                      Ja @unsets idee klingt gut ich muss mal eben kurz drüber nachdenken, und ein paar Fälle durchüberlegen.

                      ähhh... neee.. da ist je wieder das Problem der Dublette - oder ?

                      also sagen wir mal 4 Einträge ( 1.id,2.name,3.order/bzw 3.dieReihenfolge )

                      1 socken 10
                      2 schuhe 11
                      3 hemden 12
                      4 hosen 13

                      jetzt klicke ich bei hosen auf "nach oben"
                      was passiert:

                      3 hemden 12 bekommt nun die "13" von hosen und nun wird 13-1 gemacht ... hmm ok jetzt wo ichs getippt hab, hab ichs glaub begriffen

                      Ich poste es trotzdem mal.

                      Danke für die Unterstützung

                      Kommentar


                      • #12
                        Original geschrieben von strassencoder
                        Ja @unsets idee klingt gut ich muss mal eben kurz drüber nachdenken, und ein paar Fälle durchüberlegen.

                        ähhh... neee.. da ist je wieder das Problem der Dublette - oder ?

                        also sagen wir mal 4 Einträge ( 1.id,2.name,3.order/bzw 3.dieReihenfolge )

                        1 socken 10
                        2 schuhe 11
                        3 hemden 12
                        4 hosen 13

                        jetzt klicke ich bei hosen auf "nach oben"
                        was passiert:

                        3 hemden 12 bekommt nun die "13" von hosen und nun wird 13-1 gemacht ... hmm ok jetzt wo ichs getippt hab, hab ichs glaub begriffen

                        Ich poste es trotzdem mal.

                        Danke für die Unterstützung
                        Ich glaub ich versteh dein Problem schon - ich würd zuerst die IDs der beiden zu wechselnden Datensätze ermitteln. Du solltest dann also z.B. 2 Variablen haben

                        $nachObenID = 13;
                        $nachUntenID = 12;

                        damit dann:

                        Update .... set sortierspalte = sortierspalte + 1 WHERE ID = $nachUntenID
                        und
                        Update .... set sortierspalte = sortierspalte - 1 WHERE ID = $nachObenID

                        Du siehst - IDs sind ne tolle Sache
                        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                        Schön - etwas Geschichte kann ja nicht schaden.
                        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                        Kommentar


                        • #13
                          Ja, bzw sortierfelder sind ne tolle Sache wenn man den Trick weiß...

                          aber dank unsets gutem Vorschlag, denke ich bekomme ich es spielend hin.

                          denn da kann ja nix mehr schiefgehen, vorrausgesetzt beim neu-anlegen der Artikel ist eine Fortlaufende nummer drin,

                          dann noch nach löschen eines Artikels, sollte der Job laufen, der die Nummern wieder fortlaufend macht - und gut.

                          Vielen Dank, ich bin der Meinung mir wurde geholfen.

                          Kommentar


                          • #14
                            Eine Frage hätte ich noch: klingt komisch aber auf die schnelle fällt mirs net ein:

                            Wie bekomme ich den Eintrag davor ?

                            Wenn der zu ändernde Eintrag die id=137 hat und der davor 132

                            Jetzt wirds für mich verzwickt, da meine SQL-Kenntnisse auf SELECT FROM basieren

                            Also auf PHP-Ebene würde ich alles in ein array tun und dann die vorausgehende `id` im Array abfragen... aber das geht bestimmt auch direkt im SQL

                            SELECT * FROM `artikel` WHERE `id` = '137' ( LIMIT -1 wäre net schlecht, gibts aber net)

                            Gruß Andre

                            Kommentar


                            • #15
                              Zuerst ermittelst du die Sortiernummer vom DS mit der ID 137 - wie das geht sollte ja soweit klar sein ;-)

                              Danach:

                              SELECT * FROM `artikel`
                              WHERE `sortierspalte` < 'Sortiernummervon137'
                              ORDER BY `sortierspalte`DESC
                              LIMIT 1
                              Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                              Schön - etwas Geschichte kann ja nicht schaden.
                              Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                              Kommentar

                              Lädt...
                              X