2 Stimmen

Wie sortiert man IDs unterschiedlicher Länge (zusammengesetzte Zeichenkette + numerisch)?

Ich habe eine MySQL-Datenbank, deren Schlüssel von diesem Typ sind:

A_10
A_10A
A_10B
A_101
QAb801
QAc5
QAc25
QAd2993

Ich möchte, dass sie zuerst nach dem Alpha-Teil und dann nach dem numerischen Teil sortiert werden, genau wie oben. Ich möchte, dass dies die Standardsortierung für diese Spalte ist.

1) Wie kann ich wie oben beschrieben sortieren, d. h. eine MySQL-Funktion schreiben?
2) Wie kann ich festlegen, dass diese Spalte standardmäßig die Sortierroutine verwendet?

einige Einschränkungen, die hilfreich sein könnten: Der numerische Teil meiner IDs übersteigt nie 100.000. Ich nutze diese Tatsache in einem Javascript-Code, um meine IDs in Zeichenketten zu konvertieren, indem ich den nicht-numerischen Teil mit der (Zahl + 1.000.000) verkette. (Zu der Zeit hatte ich nicht bemerkt, die Variationen/Unterteile wie oben wie A_10A, A_10B, so muss ich diesen Teil meines Codes zu überarbeiten).

2voto

a1ex07 Punkte 36186

Der beste Weg, das zu erreichen, was Sie wollen, ist, jeden Teil in einer eigenen Spalte zu speichern, und ich würde dringend empfehlen, die Tabellenstruktur zu ändern. Wenn das nicht möglich ist, können Sie Folgendes versuchen:

Erstellen Sie 3 UDFs, die Präfix, numerischen Teil und Postfix Ihrer Zeichenkette zurückgeben. Für eine bessere Leistung sollten sie nativ sein (Mysql ist, wie jedes andere RDMS, nicht wirklich gut im komplexen String-Parsing). Dann können Sie diese Funktionen aufrufen in ORDER BY Klausel oder im Triggerkörper, der Ihre Spalte validiert. In jedem Fall wird es langsamer funktionieren, als wenn Sie 3 Spalten erstellen.

0voto

Paul Punkte 1477

Keine einfache Antwort, die ich kenne. Ich hatte etwas ähnliches vor einer Weile zurück, aber hatte zu jQuery verwenden, um es zu sortieren. Also, was ich tat, war zunächst die Ausgabe in ein Javascript-Array. Dann können Sie eine Null-Padding, um Ihre Zahlen einfügen möchten. Trennen Sie die Alpha von Nummerics mit einem Regex, dann wieder zusammensetzen das Array:

var zarr = new Array();

for(var i=0; i<val.length; i++){

    var chunk = val[i].match(/(\d+|[^\d]+)/g).join(',');
    var chunks = chunk.split(",");

    for(var s=0; s<chunks.length; s++){

        if(isNaN(chunks[s]) == true)
            zarr.push(chunks[s]);
        else
            zarr.push(zeroPad(chunks[s], 5));

    }
}

function zeroPad(num,count){ 
var numZeropad = num + '';
while(numZeropad.length < count) {

numZeropad = "0" + numZeropad; 
}
return numZeropad;
}

Am Ende erhalten Sie ein Array wie dieses:

A_00100
QAb00801
QAc00005
QAc00025
QAd02993

Dann können Sie eine natürliche Sortierung vornehmen. Ich weiß, Sie können es durch gerade MySQL tun wollen, aber ich bin nicht zu sicher, ob es natürliche Sortierung tut.

Viel Glück!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X