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

  • fauxxami
    hat ein Thema erstellt [Erledigt] MySQL-Sortierproblem.

    [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

  • akretschmer
    antwortet
    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.

    Einen Kommentar schreiben:


  • fauxxami
    antwortet
    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.

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    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.

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    Weil es sich um Postgres-Dialekt handelt... um das zu verwenden, müsstest du von MySQL auf Postgres umsteigen.

    Einen Kommentar schreiben:


  • fauxxami
    antwortet
    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.

    Einen Kommentar schreiben:


  • fauxxami
    antwortet
    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.

    Einen Kommentar schreiben:


  • fauxxami
    antwortet
    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.

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    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.

    Einen Kommentar schreiben:


  • VPh
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X