Offset nach Column1, weiter nach Sort laut Column2

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

  • Offset nach Column1, weiter nach Sort laut Column2

    Hallo mitsammen!

    Bin noch kein SQL-Profi, weshalb ich mir an folgeder Anforderung derzeit die Zähne ausbeiße (schwitz):

    Aufgabenstellung:
    - Tabelle 'item' enthält Beiträge, Main-Key ist 'id'.
    - In einer Liste werden items, sortiert nach 'ranking' angezeigt
    - User kann auf ein item klicken und kommt zu einem Detailfenster mit diesem
    - Dort soll er ab diesem item vor und zurückblättern können und zwar sort laut 'ranking' (also Sort gleich wie in der Liste), d.h. Offset mit der id und dann mit dem nächsten laut Sortierung 'ranking' weiter oder zurück

    Frage:
    Wie soll das SQL-Statement zum Vor- bzw. Rückwärtsblättern im Detailfenster aussehen?

  • #2
    Hi,

    Gegenfrage: wie weit bist Du bisher und woran hakt es genau?!

    mfg streuner
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
    der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

    "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

    Kommentar


    • #3
      Unterfangen ist nicht ganz leicht, wenn man bedenkt, dass sich ein ranking verändern kann oder es unter Umständen sogar gleich platzierte Einträge gibt.

      Spontaner einfall: Finde die Position des aktuellen Datensatzes heraus. Dann kannst du mit LIMIT auch den entsprechend höheren/tieferen Eintrag auslesen.

      PS: Wenn das ding deine Hausaufgaben sind und das Ranking fortlaufend ist, dann wäre es ja einfach.

      Also neben der Antwort auf die bereits genannte Gegenfrage wären ein paar mehr Infos angebracht.

      Kommentar


      • #4
        haken...

        Hallo streuner,

        danke für die Blitz-Reaktion!

        Die Sache läuft nach dem normalen Sort tadellos:

        Code:
        if ($mode == "this") {
          $line = sql("SELECT * FROM item WHERE id = $id");
        }
        elseif ($mode == "next") {
          $line = sql("SELECT * FROM item WHERE id > $id AND category = $currcat ORDER BY id LIMIT 1");
        }
        elseif ($mode == "prev") {
          $line = sql("SELECT * FROM item WHERE id < $id AND category = $currcat ORDER BY id DESC LIMIT 1");
        }
        'this' bedeutet einstieg in die php-seite mit einer bestimmten id von außen. Wenn man in der Seite auf 'next' oder 'prev' klickt, dann kommt er mit 'next' oder 'prev' herein und soll dementsprechend das nächste/vorige item anzeigen. Wahr scheinlich kann man auch das eleganter lösen als der Code hier oben.

        Nun soll aber der o.a. Code entsprechend abgeändert sein, dass 'next' und 'prev' zwar mit einer bestimmten id aufsetzt, aber dann die nächste/vorige laut 'ranking' holt.

        Gruß
        BimboBanani

        Kommentar


        • #5
          also generell sollte man nicht nach id sortieren.

          aber was spricht dagen, statt der id das ranking zunehmen?

          ansonsten siehe Post oben.

          Kommentar


          • #6
            Hi,

            wenn ich dich richtig verstehe, musst du das dann z.B. als Parameter bei dem link zusätzlich übergeben, damit du entsprechend den Datensatz bei prev oder next aufrufst (und natürlich in deinem SQL Statement mit einbinden) und warum sortierst du nach id???

            mfg streuner
            Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
            der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

            "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

            Kommentar


            • #7
              id &amp; ranking

              Hallo TobiaZ,

              nun, die id ist der Hauptschlüssel mit Spaltennamen 'id' und unique; absteigend sind damit automatisch die letzten Beiträge zuerst (was ist daran falsch?).

              Ranking ist ein Integer-Wert, wo auch mal gleiche hintereinander kommen können, kann also duplicates haben > keine eindeutige Identifizierung. Also kann ich nicht mit 'ranking' einsteigen, da ich ja mit einem ganz bestimmten Datensatz einsteigen muss und ab diesem dann weiterblätten. 'id' kann ich nicht auf größer/kleiner abfragen, da ja der Sort nach 'ranking' geht. Fazit: Einstieg nach 'id', weiterblättern nach 'ranking'. Aber wie?

              Kommentar


              • #8
                Linkübergabe

                @streuner

                was ich als Beispiel gepostet habe, das ist die funktionierende Variante, wenn die Sortierung chronologisch erfolgt.

                Ich bräuchte ersetzweise die SQL-Statements, wenn die Sorteirung nach Ranking ist (der Benutzer kann auswählen, wie er das Zeugs sehen will: Chronologisch oder nach Ranking). Demnach sieht er die Ausgangsliste so oder so. Auf der Liste kann er ins Detail gehen und in dieser dann weiter-/zurückblättern. Die Seite ruft sich selbst auf beim Blättern, deshalb die Parameter 'this' (von außen komm ich her), 'next' oder 'prev' (von innenn mit blättern).
                Natürlich weiß das Script, welcher Sort-Modus aktiv ist. Ist es chronologisch, dann passt o.a. SQL. Ist Sort 'ranking' dann suche ich, wie es anstatt dessen heißen soll.

                Kommentar


                • #9
                  nun, die id ist der Hauptschlüssel mit Spaltennamen 'id' und unique; absteigend sind damit automatisch die letzten Beiträge zuerst (was ist daran falsch?).
                  Naja, man geht davon aus, dass eine ID eine einzige Eigenschaft hat: Sie ist eindeutig. Alles andere trifft bei dir eigentlich nur eher zufällig zu. (zumindest in der Theorie, in deinem Fall kann es für lange Zeit gut gehen, aber wer weiß. Think Big.)

                  Die Tatsache dass du die letzten Beitrag zuerst anzeigen willst, zeigt eigentlich dass du eigentlich ein Datumsfeld zur Sortierung nehmen möchtest. Das wäre dann auch semantisch korrekt.

                  Ranking ist ein Integer-Wert, wo auch mal gleiche hintereinander kommen können, kann also duplicates haben > keine eindeutige Identifizierung.
                  Dann hast du doch hier schon ein Problem. Wonach entscheidest du jetzt, welcher Eintrag auf Platz 4 und welcher auf Patz drei ist, wenn sie eigentlich den gleichen Wert haben. Sobald du das geklärt hast, ist auch wieder eine eindeutige Zuordnung anhand der Position möglich.

                  Also kann ich nicht mit 'ranking' einsteigen, da ich ja mit einem ganz bestimmten Datensatz einsteigen muss und ab diesem dann weiterblätten.
                  Wenn du nicht damit einsteigen kannst, kannst du auch nicht weiterblättern. Außer du hast das Problem ein Quote höher gelöst. Aber dann kannst du wie gesagt auch damit einsteigen. Insgesamt ist es ja aber unerheblich womit du einsteigst.

                  Aber wie?
                  Habe ich bereits in meiner ersten Antwort erklärt.

                  PS:

                  was ich als Beispiel gepostet habe, das ist die funktionierende Variante, wenn die Sortierung chronologisch erfolgt.
                  Wohlgesagt NUR wenn es keine Zeitgleichen Einträge gibt. Und jetzt übertrag das mal auf das Ranking. Merkst du was?

                  Kommentar


                  • #10
                    Am Thema vorbei

                    Lieber TobiaZ,

                    zuerstmal danke für Deine Mühe um ausführliche Stellungnahme zu verschiedenen Aussagen.

                    Meine Frage war aber nicht dahingehend, ob ich mein Datenbankdesign richtig gemacht habe oder nicht. Die Beobachtung habe ich übrigens schon häufig in Foren gemacht: Eine Frage zu einem bestimmten Thema und die Antworten sind dann eigentlich keine, sondern vielmehr Stetments der Schreiber, was man an einem anderen Eck etwas anders machen könnte-sollte. Aus diesem Grund suche ich lieber zwei Stunden im Netz, bevor ich mich mal in ein Forum begebe, um zu fragen. Und - was passiert? Ich mache genau dieses Erlebnis, was ich so oft beobachtet habe. Hier (allgemein, nicht nur dieses Forum betreffend) wünsche ich mir (und das sicher im Namen sehr vieler, die täglich in Foren um etwas fragen und dabei keine faulen Säcke sind und fragen ohne vorher zu suchen), ernst genommen zu werden, gehört zu werden und nur auf das eine Antwort zu bekommen, worum gefragt wurde.

                    Also: Wenn mir jemand helfen möchte, dann bitte im Sinne einer Antwort zu meinem Anliegen, auch wenn diese sein sollte 'das geht nicht' oder 'ich weiß es nicht'. Ratschläge außerhalb des Themas, wie ich was besser designen könnte, brauch ich, ehrlich gesagt, nicht, denn dazu hab ich mir schon Gedanken gemacht. Ganz abgesehen davon, dass es eigentlich nicht möglich ist, zu etwas, das man nicht im ganzen Umfang kennt, zu reden.

                    Zu Deinen 'Tips':
                    a) Datum besser als id - was kann eindeutiger hintereinander sein, als eine laufende Nummer? Abgesehen davon, dass solche Genauigkeiten von Millisekunden bei meinem Thema keine Rolle spielen.

                    b)
                    Zitat (im Zitat): Ranking ist ein Integer-Wert, wo auch mal gleiche hintereinander kommen können, kann also duplicates haben > keine eindeutige Identifizierung.
                    Dann hast du doch hier schon ein Problem. Wonach entscheidest du jetzt, welcher Eintrag auf Platz 4 und welcher auf Patz drei ist, wenn sie eigentlich den gleichen Wert haben. Sobald du das geklärt hast, ist auch wieder eine eindeutige Zuordnung anhand der Position möglich.
                    Cool - so lange ranken lassen, bis es keine gleichen Rankings gibt?! da hab ich dann in der Tat ein Problem... ex equo soll es sogar bei Weltmeisterschaften geben oder?

                    Zitat (im Zitat): Also kann ich nicht mit 'ranking' einsteigen, da ich ja mit einem ganz bestimmten Datensatz einsteigen muss und ab diesem dann weiterblätten.
                    Wenn du nicht damit einsteigen kannst, kannst du auch nicht weiterblättern. Außer du hast das Problem ein Quote höher gelöst. Aber dann kannst du wie gesagt auch damit einsteigen. Insgesamt ist es ja aber unerheblich womit du einsteigst.
                    Was ich fett gemacht habe, ist eine brauchbare Antwort: Es geht also nicht. Werd ich mich also wo anders schlau machen müssen, denn das glaube ich nicht - dafür bin ich schon zu lange im Milieu ;-)

                    Alles in allem bedanke ich mich herzlich für die schnelle Reaktion, auch wenn ich leider mit meinem Problem dadurch nicht weitergekommen bin. Sollte ich in diesem Forum nun in Ungnade fallen, weil ich mir als Fragender erlaubt habe, so zu antworten, wie das oft Antwortende tun (also ihre Meinung zu sagen), dann würde mir das leid tun, aber ich kann damit leben.

                    Tashi Delek
                    BimboBanani

                    Kommentar


                    • #11
                      Ohne jetzt hier eine Grundsatzdiskussion losbrechen zu wollen, eine ganz knappe Stellungnahme: Ja, wir schlagen oft Alternativlösungen vor. In aller Regel basieren die auf jahrelanger Erfahrung, weil wir erkennen, dass ein ganz Grundlegender Fehler vorliegt. Zu oft wurden wir genau darin bestätigt und Wünsche der Fragenden ließen sich nach den grundsätzlichen Anpassungen viel effizienter realisieren.

                      Wenn du das nicht möchtest, halte ich mich gerne aus deinen Themen raus.

                      Dann möchte ich noch Feststellen, dass ich folgende Aussage NIE gemacht habe:
                      Datum besser als id
                      Nie, Nie, Nie!

                      Auch das folgende habe ich nie behauptet:
                      Es geht also nicht.
                      Ich habe genau deine gesuchte Lösung schon mehrfach erfolgreich umgesetzt. Du kannst also auf dein Gefühl vertrauen.

                      Nein, in Ungnade bist du sicher nicht gefallen. Aber ich ziehe dennoch meine Konsequenzen, da nicht pauschal irgendwelche Antworten rauspuste, sondern gerne sehe, dass die Fragenden auf dem richtigen Weg sind.

                      Wenn wir da unterschiedlicher Meinung sind, ist das sicher okay.

                      PS: Vielleicht ist StackOverflow die bessere Platform für dich, aber ich befürchte dafür ist die ganze Angelegenheit dann doch noch zu konzeptionell. Ein versuch wäre es jedenfalls Wert. Über einen Link würde ich mich in jedem Fall freuen. Ich werde auch nicht dort antworten.

                      Viel Erfolg!

                      Kommentar


                      • #12
                        Ich habe genau deine gesuchte Lösung schon mehrfach erfolgreich umgesetzt.
                        Dann, um Himmels Willen, rück doch raus, wie? Gibt es in SQL z.B. eine Möglichkeit, einen Datensatz zu lesen, die Sortierung umzustellen und dann witerzulesen? Ich arbeite seit 30 Jahren auf Datenbanken mit direktem Zugriff, da ist das kein Thema.

                        Freue mich übrigens, dass Du nicht eingeschnappt bist (wäre andernorts vermutlich der Fall gewesen)

                        Kommentar


                        • #13
                          Spontaner einfall: Finde die Position des aktuellen Datensatzes heraus. Dann kannst du mit LIMIT auch den entsprechend höheren/tieferen Eintrag auslesen.
                          Die Frage ist halt, wie entscheidest du, ob ein Eintrag mit dem gleichen Ranking nun vor oder nach dem ausgewählten Datensatz liegt. Da hab ich jetzt aber auch schon mehrfach drauf hingewiesen...

                          Kommentar


                          • #14
                            Die Frage ist halt, wie entscheidest du, ob ein Eintrag mit dem gleichen Ranking nun vor oder nach dem ausgewählten Datensatz liegt. Da hab ich jetzt aber auch schon mehrfach drauf hingewiesen...
                            Das ist nicht so heikel. Klar kann sich das Ranking mittlerweile geändert haben, aber so genau muss es da nicht hergehen. Es geht nur darum, dass der User überhaupt nach Ranking blättern kann, wenn er das so eingestellt hat. Stellt er vorne 'sort nach Ranking' ein und drinnen blättert er nach id, fühlt er sich wohl auf den Arm genommen.

                            Wie meintest Du das mit 'position herausfinden'? Gibt es für Datensätze eine direkte Position, mit der man arbeiten kann? Wenn ja, wie setzte ich die dann ein, um auf Basis Ranking zu blättern? Hättest Du da gar eine SQL-Statement dazu?

                            Kommentar


                            • #15
                              Das ist nicht so heikel. Klar kann sich das Ranking mittlerweile geändert haben, aber so genau muss es da nicht hergehen.
                              Ist zumindest ansichtssache. Nach deinem bisherigen Prinzip würdest du auf Position 2 einen link zu "eins besser als aktueller Datensatz" anzeigen. Wenn der aktuelle zweite Datensatz jetzt besser geworden ist, dann hättest du einen 404er, weil es keinen Datensatz gibt, der besser ist als Position 1 (neue Position)

                              Ja, ist ein bisschen Tricky geschrieben.

                              Es ist also besser dem Link nur die Position anzugeben. Dann bleibt die angezeigte Seite gleich. In meinen augen ist es sogar noch besser, wenn du die ID angibst.

                              Aber da sind wir wieder auf konzeptioneller ebene, du siehst, ich will dass du es richtig machst!

                              Stellt er vorne 'sort nach Ranking' ein und drinnen blättert er nach id, fühlt er sich wohl auf den Arm genommen.
                              Wonach letztendlich sortiert wird, ist nur ein simpler parameter in der URL/Cookie/Session. Das braucht dich doch gar nicht zu kümmern. Ich wiederhole. Es ist bei beiden varianten das gleiche Vorgehen.

                              Gibt es für Datensätze eine direkte Position, mit der man arbeiten kann?
                              Nicht so direkt, aber es gibt möglichkeiten die Position über Umwege herauszufinden. Eine Suche danach wäre hier angebracht, da ich sonst ja doch wieder alles vorkaue...

                              Kommentar

                              Lädt...
                              X