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
Ankündigung
Einklappen
Keine Ankündigung bisher.
[Erledigt] MySQL-Sortierproblem
Einklappen
Neue Werbung 2019
Einklappen
X
-
[Erledigt] MySQL-Sortierproblem
Stichworte: -
-
Zitat von fauxxami Beitrag anzeigenDanke 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.
-
Zitat von akretschmer Beitrag anzeigenUnd ja: ich verwende keine Spielzeug-DB, sondern PostgreSQL.
Einen Kommentar schreiben:
-
Zitat von fauxxami Beitrag anzeigenWenn 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.
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:
-
Weil es sich um Postgres-Dialekt handelt... um das zu verwenden, müsstest du von MySQL auf Postgres umsteigen.
Einen Kommentar schreiben:
-
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 anzeigenselect * from fauxxami order by regexp_replace(trim(leading ',' from val),',.*$','')::int;
Einen Kommentar schreiben:
-
Zitat von akretschmer Beitrag anzeigenNatürlich geht das:
Einen Kommentar schreiben:
-
Zitat von VPh Beitrag anzeigenIDs Komma getrennt in eine Spalte zu knallen sieht sehr nach schlechtem Datenbankdesign aus.
Stichwort: Normalisierung.
Zitat von VPh Beitrag anzeigenWenn 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:
-
Zitat von fauxxami Beitrag anzeigenIch 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?
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)
Einen Kommentar schreiben:
-
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:
Einen Kommentar schreiben: