Ankündigung

Einklappen
Keine Ankündigung bisher.

TIPP GESUCHT: MySQL - Sortierung alphanumerischer Ordnungsnummern?

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

  • TIPP GESUCHT: MySQL - Sortierung alphanumerischer Ordnungsnummern?

    Hallo,

    in einem VARCHAR-Feld (genannt onr) habe ich alphanumerische Ordnungsnummern nach dem Muster 2.8.10.4 gespeichert.
    Die hierarchische Darstellung scheitert bisher an der Sortierbarkeit.

    Ich kann mir eigentlich nicht vorstellen, dass es in MYSQL keine spezielle Funktion für diese uralte Ordnungsdeklaration gibt, wenn selbst für IP-Adressen eine Funktion vorhanden ist.

    Zusatz: Die Sortierung muss nach folgenden Muster erfolgen:

    1
    1.4.3
    1.7.3.6.34.3.2
    1.10
    2
    ...

    Einfache CAST-Funktionen wie "... ORDER BY CAST(onr AS UNSIGNED)" nutzen nur die ersten Zahlen zur Sortierung. Alle Angaben nach dem Punkt werden ignoriert.

    Ich hoffe mir kann hier einer helfen


  • #2
    Du meinst, Crossposting http://www.selfphp.info/forum/showthread.php?t=24850 hilft Dir schneller?

    Einfaches schnödes ORDER BY onr sollte helfen...

    Kommentar


    • #3
      wenn du maximal 4 ebenen hast - und die einzelnen "Ziffern" maximal 255 betragen , dann caste das ding als IP-Adresse und missbrauche dies ...


      wenn du mehr Ebenen hast .. gehts auf die "umständliche" - hänge alles hintereinander - und fülle "Leerstellen" mit 0 auf
      Code:
      1              -> 1.00.0.0.00.0.0
      1.4.3          -> 1.04.3.0.00.0.0
      1.7.3.6.34.3.2 -> 1.07.3.6.34.3.2
      1.10           -> 1.10.0.0.00.0.0
      2              -> 2.00.0.0.00.0.0
      ..- so kann man das - auch in der Abfrage mit Concat,substring und Length zerlegen, auffüllen und wieder zusammenfügen ... ist natürlich etwas aufwändig

      wenn es dann immer noch streikt - dann ohne die Punkte nach gleichem Schema zusammenschrauben
      [Quote=nikosch]
      So glatt kann doch wirklich keiner sein.[/quote] :roll:

      Kommentar


      • #4
        Eine saubere Lösung besteht darin, die Ordungsnummern in getrennten Spalten zu speichern:
        Buch 1
        Kapitel 7
        Unterkapitel 3
        wird beim Auslesen zu 1.7.3 (MySQL-Stichwort CONCAT)

        Noch eins: Dein Problem könnte ein Hinweis auf mangelhafte Normalisierung sein.

        Kommentar


        • #5
          Hallo,

          @raiguen: ja, Crossposting erhöht die Wahrscheinlichkeit eine Antwort zu bekommen, so wie eine Auswahl unter mehreren TV-Sender die Wahrscheinlichkeit erhöht einen unterhaltsamen Abend zu verbringen. Ist also absolut legitim

          @beliar284: wie bereits gesagt, es ist ein offenes Nummernsystem - die Anzahl der Unterebenen ist völlig frei. Meine Überlegung war ja, wenn man schon Funktionen in MySQL implementiert, die mit IP-Adressen umgehen können, so wäre ja der Umgang per Funktion mit diesem System an Ordnungsnummern ebenfalls naheliegend. Immerhin handelt es sich bei dem System um die älteste Form von Strukturierungen.

          @achtelpetit: die saubere Lösung habe ich bisher so angewendet, die neuere Aufgabe bestand aber darin, Inhalte zu strukturieren und man dazu noch keine Tiefe angeben konnte. Um dein Beispiel aufzugreifen, käme Seitenblock 4, Seite 3, Absatz 5, Satz 3, Wort 4, Buchstabenfeld 2, Zeichen 3, ... hinzu. Das von dir gewählte Beispiel endet hier leider, weil mir nichts einfällt wie es weitergehen könnte )) ...
          Ich habe nicht ganz verstanden, inwiefern eine mangelhafte Normalisierung vorliegen könnte? Gib mal ein Tipp ...

          Danke schonmal an alle Antwortgeber, vielleicht finden wir noch eine Lösung.

          Kommentar


          • #6
            naja - man könnte es auf ganze 2 Angaben beschränken

            1) eigene Nummer
            2) Vater-Element

            wenn Vater-Element = NULL -> höchste Ebene erreicht

            das verkompliziert allerdings Abfragen "ein wenig" - weil du dir die Hierarchie dynamisch zusammenbasteln musst - Stichwort "nested sets"
            [Quote=nikosch]
            So glatt kann doch wirklich keiner sein.[/quote] :roll:

            Kommentar


            • #7
              @beliar284: ja, die Lösung läuft bei mir auch bereits in einer anderen Anwendung.
              Aber: je tiefer die Struktur desto weniger Performance, ab einer Strukturtiefe von 8 kann man schon etwas warten. Daher habe ich damals sogar Mischformen gebildet. Fazit: Das ist leider keine Lösung für mein Problem.

              Ich hatte irgendwo ein SUBSTRG-Scriptkonstrukt gefunden ... und leider wieder verloren. Das erweckte den Anschein, es könnte mit einer n-Anzahl von Trennzeichen umgehen.

              Kommentar


              • #8
                das klingt für mich, als ob du nochmal zum Konstruktionsbrett zurück müsstest - im Regelfall sollte sich quasi JEDES Schema mit maximal 4 Ebenen abbilden lassen - oder du verkomplizierst die Sache zu sehr
                [Quote=nikosch]
                So glatt kann doch wirklich keiner sein.[/quote] :roll:

                Kommentar


                • #9
                  hmmm .... ich kann "im Regelfall" und "JEDES Schema mit maximal 4 Ebenen" jetzt nicht deuten ...

                  Vielleicht habe ich vergessen zu sagen, es handelt sich um ein hierarchische Ordnungssystem. Die Struktur eines internationalen Unternehmens gliedert sich im Regelfall in mehr als 4 Ebenen vielleicht ist dies ein gutes Beispiel zur Visualisierung des Problems

                  Kommentar


                  • #10
                    Zitat von WhiskaMD Beitrag anzeigen
                    ja, Crossposting erhöht die Wahrscheinlichkeit eine Antwort zu bekommen, so wie eine Auswahl unter mehreren TV-Sender die Wahrscheinlichkeit erhöht einen unterhaltsamen Abend zu verbringen. Ist also absolut legitim
                    Dazu aus den Forenregeln:

                    Da viele User forenübergreifend organisiert sind, werden entsprechende Beiträge sehr oft als Multipostings erkannt und markiert. Nicht vom TE gekennzeichnete Multipostings werden im Allgemeinen geschlossen. Um dem vorzubeugen, sollte der TE seinen Beitrag mit einem Link auf den Ursprungsthread und einer kurzen Begründung als Multiposting kennzeichnen. Noch besser ist es, das Problem mit der nötigen Geduld im Ursprungsforum zu klären.
                    /report

                    PS: @das Problem: Bau eine richtige Hierarchie auf, so wie beliar gesagt. nested sets sind genau was du brauchst. Keine Diskussion.
                    Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

                    Kommentar


                    • #11
                      Ich hatte auf eine einfachere Lösung gehofft, als die von "nested sets". Und die greifen auch nicht auf die Ordnungsnummern zurück, da steckt ja schon alles an Struktur drin.

                      @ApoY2k: An Regeln sollte man sich halten, klaro. Ich werde den Hinweis befolgen, wenn es geeignet erscheint. Allerdings habe ich persönlich noch nie einen Verweis verfolgt, der mich zu einer weiteren Anmeldung in einem anderen Forum verpflichtet und so werden andere vielleicht auch denken. Ich baue also eventuell Hürden für die Ratgeber ein. Es war für mich auch nicht ersichtlich, ob und wieviel User des einen Forums identisch mit denen eines anderen Forums sind - Multiposting wirkt ja nur dort störend - und so hoffte ich auf andere Leser. Und wenn ich glaube, das zuerst gewählte Forum scheint schlechter besucht, sollte man auch wechseln dürfen. "Geduld" ist im IT-Sprachgebrauch negativ behaftet und schlecht kommunizierbar - das sowas in Forenregeln steht verwundert mich

                      Kommentar


                      • #12
                        Zitat von WhiskaMD Beitrag anzeigen
                        hmmm .... ich kann "im Regelfall" und "JEDES Schema mit maximal 4 Ebenen" jetzt nicht deuten ...

                        Vielleicht habe ich vergessen zu sagen, es handelt sich um ein hierarchische Ordnungssystem. Die Struktur eines internationalen Unternehmens gliedert sich im Regelfall in mehr als 4 Ebenen vielleicht ist dies ein gutes Beispiel zur Visualisierung des Problems
                        Damit ist gemeint, daß definiert sein sollte, wieviele Ebenen da sein können.

                        Ich könnte mir eine Funktion vorstellen, die aus '1.3.45' z.B. 100300045 macht, und man sortiert nach dem Resultat der Funktion. Wäre kein großes Ding, denke ich mal.

                        Andreas
                        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                        Kommentar


                        • #13
                          Das Normalisierungsproblem könnte (!) darin stecken, daß jede einzelne Ordnungszahl ihren Wert erst durch ihre Nachbarn erhält.
                          Es soll aber in einer relationalen Datenbank der Wert eines Eintrags aus seiner Spaltenbezeichnung hervorgehen. Habe ich die Zahl "7" (z.B.) aus der Spalte "GewichtInGramm", dann bedeutet sie eben das. Muß ich, um die "7" zu interpretieren aber die Maßeinheit aus einer anderen Spalte holen, so könnten vielleicht auch 7 Unzen gemeint sein; so eine Konstruktion ist nicht zulässig.

                          Ob das auf Dein Problem anwendbar ist weiß ich nicht, solange Du nicht verrätst, worum es tatsächlich geht.

                          Kommentar


                          • #14
                            @akretschmer: ich verstehe

                            @achtelpetit: ich denke es ist i.d.S. kein Normalisierungsproblem. Der Wert steht in der selbigen Spalte, Beispiel: 2.3.4 ist Unterebene von 3 und mit dieser der 2 untergeordnet. So die einfache Logik der Verwaltungsmenschen im RealLife. Man könnte das zerlegen in Ebenenspalten, müsste dann aber ggf. immer die Tabelle erweitern, das wollte ich vermeiden. Zumal es für so ein ähnliches Problem schon Funktionen gibt wie die INET_ATON(ip) - hier wird der alphanumerisch Wert ja auch besonders behandelt.

                            Derzeit besteht nur die Herausforderung die Ausgabe nach diesen Ordnungsnummern zu sortieren.

                            Kommentar


                            • #15
                              Wieso ignorierst du eigentlich jeden Hinweis in Richtung nested sets?
                              Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

                              Kommentar

                              Lädt...
                              X