Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] MySQL-Sortierproblem

Einklappen

Neue Werbung 2019

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

  • [Erledigt] MySQL-Sortierproblem

    Guten Tag,

    ich plage mich mit einem Sortierproblem, für das es vielleicht gar keine Lösung gibt. Aber bevor ich aufgebe, wollte ich hier einmal gefragt haben:

    Ich frage mit PHP bestimmte Datensätze aus einer MySQL-Datenbank ab, die eine VARCHAR-Spalte namens `ClassIds` haben. In dieser Spalte stehen numerische Werte, die durch Kommata getrennt sind. Mögliche Werte können also sein ",2," oder auch ",2,3,4,". Nun würde ich das Abfrageergebnis gerne nach diesem Attribut sortieren, und zwar nach dem numerischen Wert des ersten Eintrags. Sortiere ich einfach mit "ORDER BY `ClassIds`", so steht der Eintrag ",20," vor dem Eintrag ",3," - was logisch, aber von mir so nicht gewollt ist.

    Dass ich das Ganze mit PHP bewältigen kann, ist mir schon klar. Ich wüsste nur gerne, ob das auch nur mit SQL-Mitteln geht. Kann da jemand helfen?

    Vielen Dank und Grüße,

    fauxxami


  • #2
    IDs Komma getrennt in eine Spalte zu knallen sieht sehr nach schlechtem Datenbankdesign aus.
    Stichwort: Normalisierung.

    Wenn du es wirklich mit dieser Struktur lösen willst, wovon ich stark abrate, kannst du das sicher über Views/temporäre Tabellen und Stringfunktionen der Datenbank lösen, allerdings würdest du die Normalisierung dann quasi während der Laufzeit durchführen. Performant geht anders.
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

    Kommentar


    • #3
      Zitat von fauxxami Beitrag anzeigen
      Ich frage mit PHP bestimmte Datensätze aus einer MySQL-Datenbank ab, die eine VARCHAR-Spalte namens `ClassIds` haben. In dieser Spalte stehen numerische Werte, die durch Kommata getrennt sind. Mögliche Werte können also sein ",2," oder auch ",2,3,4,". Nun würde ich das Abfrageergebnis gerne nach diesem Attribut sortieren, und zwar nach dem numerischen Wert des ersten Eintrags. Sortiere ich einfach mit "ORDER BY `ClassIds`", so steht der Eintrag ",20," vor dem Eintrag ",3," - was logisch, aber von mir so nicht gewollt ist.

      Ich wüsste nur gerne, ob das auch nur mit SQL-Mitteln geht. Kann da jemand helfen?
      Natürlich geht das:

      Code:
      test=*# select * from fauxxami ;
         val
      ---------
       ,2,3,4,
       ,20
       ,3,4
       ,12,13
      (4 rows)
      
      test=*# select * from fauxxami order by regexp_replace(trim(leading ',' from val),',.*$','')::int;
         val
      ---------
       ,2,3,4,
       ,3,4
       ,12,13
       ,20
      (4 rows)
      Wäre ich Du, würde ich den Müll aber sauber normalisieren.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Zitat von VPh Beitrag anzeigen
        IDs Komma getrennt in eine Spalte zu knallen sieht sehr nach schlechtem Datenbankdesign aus.
        Stichwort: Normalisierung.
        Mit diesem Einwand habe ich gerechnet und hätte deshalb wohl besser gleich dazugeschrieben, dass ich die Datenbank weder entworfen noch Einfluss auf die Struktur habe. Ich bin nur der arme Willi, der den Mist auslesen darf.

        Zitat von VPh Beitrag anzeigen
        Wenn du es wirklich mit dieser Struktur lösen willst, wovon ich stark abrate, kannst du das sicher über Views/temporäre Tabellen und Stringfunktionen der Datenbank lösen, allerdings würdest du die Normalisierung dann quasi während der Laufzeit durchführen. Performant geht anders.
        Ja, das will ich gerne glauben - und das Ganze hört sich aufwändig an. Vielleicht lasse ich dann doch lieber PHP die Arbeit machen.

        Kommentar


        • #5
          Zitat von akretschmer Beitrag anzeigen
          Natürlich geht das:
          Wow, das ging jetzt aber schnell und elegant - danke! Und wie schon gesagt: es ist nicht meine Datenbank; ich habe auf die Struktur leider keinen Einfluss.

          Kommentar


          • #6
            Wenn ich da eben noch mal nachfragen darf - die Syntax der von dir genannten SELECT-Anweisung ist mir zumindest in Teilen fremd:

            Zitat von akretschmer Beitrag anzeigen
            select * from fauxxami order by regexp_replace(trim(leading ',' from val),',.*$','')::int;
            Für 'val' verwende ich mein Attribut `ClassIds`, und ansonsten beginnt die Klausel mit SELECT und endet mit dem Semikolon? Sorry, dass ich so blöd frage, aber insbesondere der letzte Teil ("::int") ist mir komplett unbekannt. Danke für die Nachhilfe.

            Kommentar


            • #7
              Weil es sich um Postgres-Dialekt handelt... um das zu verwenden, müsstest du von MySQL auf Postgres umsteigen.
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Zitat von fauxxami Beitrag anzeigen
                Wenn ich da eben noch mal nachfragen darf - die Syntax der von dir genannten SELECT-Anweisung ist mir zumindest in Teilen fremd:



                Für 'val' verwende ich mein Attribut `ClassIds`, und ansonsten beginnt die Klausel mit SELECT und endet mit dem Semikolon? Sorry, dass ich so blöd frage, aber insbesondere der letzte Teil ("::int") ist mir komplett unbekannt. Danke für die Nachhilfe.
                Ja, val ist meine Spalte, ::int ist ein CAST nach Integer. Du hast ja einen String, willst aber numerisch sortieren, also muß man das casten. Das trim() und regexp_replace dienen dazu, den ersten Wert aus der Komma-Liste rauszuklaubeln. Und ja: ich verwende keine Spielzeug-DB, sondern PostgreSQL.

                Und ja: bringe den Müll in Ordnung. Ich könnt zwar sogar einen funktionalen Index drauflegen, dann ginge das sogar in Schnell, aber eine Lösung für das Problem wäre das noch immer nicht.
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  Zitat von akretschmer Beitrag anzeigen
                  Und ja: ich verwende keine Spielzeug-DB, sondern PostgreSQL.
                  Danke für die inhaltliche Hilfe - und auch für diesen Zwischenruf, der mir leider nicht weiterhilft. Noch einmal: es ist nicht meine Datenbank, und deshalb habe ich auf das verwendete DBMS und auf die Struktur der Daten keinen Einfluss.

                  Kommentar


                  • #10
                    Zitat von fauxxami Beitrag anzeigen
                    Danke für die inhaltliche Hilfe - und auch für diesen Zwischenruf, der mir leider nicht weiterhilft. Noch einmal: es ist nicht meine Datenbank, und deshalb habe ich auf das verwendete DBMS und auf die Struktur der Daten keinen Einfluss.
                    Dein Problem. Das DB-Schema ist Müll. Erkläre das dem Auftraggeber. Jede Lösung, die das am Leben erhält, verlängert nur die Leiden. Und erhöht damit die Kosten.
                    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                    Kommentar

                    Lädt...
                    X