2017-01-25 1 views
2

Ich möchte diesen Typ 1.1, 1.1.1, 1.1.2, 2.1, 2.1.1, 2.3, .. etc. so benutze ich Varchar Datentyp für diese Spalte Aber was passiert, ist es richtig bis 9.9.9 nach diesem 10.1.1 hier geschieht 1.1, 1.1.1, 1.1.2, 10.1.1, 2.1, 2.1 .1, ... usw. So habe ich auch DECIMAL versucht aber keine Ergebnisse.Sortierung eines "1.1.1" -Formattyps in Mysql

+0

Zum Zeitpunkt der Einfügung in der db erstellen Sie eine weitere Spalte wie unique_id, die eindeutig sein und kann zum Sortieren zum Zeitpunkt des Abrufs verwendet werden. – Abhishekkumar

+0

Als ein Hack können Sie INET_ATON und INET_NTOA verwenden – Strawberry

+1

Siehe http://stackoverflow.com/questions/7508313/mysql-sorting-of-version-numbers und beachten Sie, dass alle Lösungen mit einer Funktion zum Sortieren des Ergebnisses nicht verwenden können ein Index, so dass es wahrscheinlich langsam ist. Wenn die Leistung kritisch ist, sollten Sie jeden Teil der Zeichenfolge als separate Spalten speichern, damit sie indiziert werden können. –

Antwort

0

Sie können Wert in drei verschiedene Spalten parsen, die in Ihrer Datenbank nicht benötigt werden, Anwendungscode wird es einfacher machen. Dann wird es so einfach wie

select ... order by col1, col2, col3 
+0

danke Kumpel .. !! –

0

Eine gute Idee wäre, Ihre Nummer als feste Größe, z.

  • 1.1.1 => 001.001.001 (oder kurz 1001001)
  • 1.1 => 1.001.000
  • 9.9.9 => 9009009

So können Sie Ihre Variable als Nummer speichern. Beim Abrufen müssen Sie mit modulo spielen, um Ihre Nummer wieder auf string zu setzen. Die Haupteinschränkung wird sein, dass Sie entscheiden müssen, wie viele für jedes Segment verfügbar sind (in meinem Beispiel ist 999 das Maximum für jedes Segment. Diese Methode ist, wie ich die IP-Adresse speichern möchte (zB 192.168.1.1 wird zu 192168001001) .

+0

Danke Buddy .. !! –

0
diesen

Versuchen:

SELECT 
    * 
FROM 
    my_table 
ORDER BY 
    CAST(SUBSTRING_INDEX(my_col, '.', 1) AS UNSIGNED) ASC, 
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(my_col, '.', -2), '.', 1) AS UNSIGNED) ASC, 
    CAST(SUBSTRING_INDEX(my_col, '.', -1) AS UNSIGNED) ASC 

im Grunde ist es mit jedem Teil der Zeichenfolge, die durch Verwendung von links nach rechts

den teil~~POS=TRUNC jeden Teil des Strings, und sortiert die Reihen bekommt. Update: Die obige Abfrage funktioniert für genau 3 Nummern, aber wenn Sie w Ameise 4 Zahlen zu unterstützen, dann verwenden Sie diese Abfrage:

SELECT 
    * 
FROM 
    my_table 
ORDER BY 
    SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(my_col, '.'), '.', 1), '.', -1) + 0 
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(my_col, '.'), '.', 2), '.', -1) + 0 
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(my_col, '.'), '.', 3), '.', -1) + 0 
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(my_col, '.'), '.', 4), '.', -1) + 0 

Und wenn Sie wollen mehr Zahlen unterstützen, fügen Sie einfach die folgende: „XX“ mit der nächsten Nummer ersetzt:

, SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(my_col, '.'), '.', XX), '.', -1) + 0 

Credit Diese Antwort auf eine sehr ähnliche Frage: https://stackoverflow.com/a/17849200/2518200

+0

Hallo Danke für die Antwort, die ich versucht habe, aber immer noch Sortieren wird nicht richtig Ergebnis. Ergebnis von oben Abfrage erhalten: 7.3.1.1, 7.3.1.2, 7.3.1.4, 7.3.2.2, 7.2.4, 12.2.1, 12.2 Ergebnis Wunsch 7.2.4, 7.3.1.1, 7.3.1.2 , 7.3.1.4, 7.3.2.2, 12.2, 12.2.1 –

+1

@Jaineshshah Entschuldigung, diese Abfrage war für 3 Nummern. Da du bis zu 4 Nummern oder mehr hast, musste ich meine Antwort ändern. Bitte sehen Sie meine aktualisierte Antwort. Sie können diese neue Abfrage für jede Länge verwenden. –