2016-05-04 12 views
0

Ich möchte alphanumerische Daten mit mysql sortieren. Meine Daten sind einige typicall Art wie:Sortieren von alphanumerischen Daten nach MySql

XYZ-1.0-7.0-1 
XYZ-1.0-27.0-5.7 
XYZ-1.0-20.0-4.6 
XYZ-1.0-10.0-2.4 
----------------- many more data in this format ------------ 

ich gegoogelt und viele Links gefunden, aber keiner arbeiten.

Ich mag diese Daten als Ausgang:

XYZ-1.0-7.0-1 
XYZ-1.0-10.0-2.4 
XYZ-1.0-20.0-4.6 
XYZ-1.0-27.0-5.7 
+0

Was zuerst * 1.11 * oder * 1.2 * kommt? –

+0

Bestellung wird 1.0 dann 1.1 und so weiter. Und es wird in allen Fällen nach "-" Zeichen verwendet. – steven

Antwort

0

. und - aus dem entfernen Werte und sortieren.

Abfrage

SELECT * FROM your_table_name 
ORDER BY CAST((
    REPLACE(REPLACE(
     RIGHT(your_column_name, LENGTH(your_column_name) - 4), '.', ''), '-', '')) 
AS UNSIGNED); 

SQL Fiddle Demo

+0

Es funktioniert nicht, wenn ein Wert ist: ('XYZ-1.1-7.0-1') – steven

+0

@steven: Ich habe den Wert 'XYZ-1.1-7.0-1' hinzugefügt, und es funktioniert gut. Bitte überprüfe diese Geige. http://sqlfiddle.com/#!9/8aec82/1 – Wanderer

+0

Wenn wir "XYZ-1.1-7.0-1" hinzufügen, dann sollte es an der Unterseite kommen. – steven

0

Ein Computer nicht tun können, was Sie ohne Ihre Hilfe automatisch möchten. Um diese Werte zu sortieren, müssen Sie die Abfrage, die das Format Ihrer Zeichenfolge ist, "lehren". Wenn das Format immer gleich "XXX-9.9-9.9-9.9" ist, müssen Sie eine Abfrage erstellen, die Ihre Zeichenfolge dynamisch in seine Werte aufteilt und dann sortiert. Etwas wie:

SELECT * FROM your_table_name ORDER BY SUBSTRING(col,3), substring(col,5,2), substring(col,5,2), substring(col,9,2) 

Das andere Problem ist, dass Ihre numerischen Werte sind nicht immer in dem gleichen String-Format: zum Beispiel haben Sie im dritten Teil „7,0“ und „27.0“. Wenn die Werte auf "07.0" und "27.0" formatiert wären, würde das funktionieren. Um mit diesen Werten zu arbeiten, müssen Sie sie in Zahlen umwandeln. Hoffe, das hilft.

0

Diese Abfrage wird die Zeichenfolge in Teile aufgeteilt:

select t.col 
    , cast(num1 as unsigned) n1 
    , cast(num2 as unsigned) n2 
    , cast(num3 as unsigned) n3 
    , cast(num4 as unsigned) n4 
    , cast(num5 as unsigned) n5 
    , cast(num6 as unsigned) n6 
from (
    select t.col 
     , SUBSTRING_INDEX(t.col, '-', 1) str 
     , SUBSTRING_INDEX(t.col, '-', -3) num1 
     , SUBSTRING_INDEX(t.col, '.', -3) num2 
     , SUBSTRING_INDEX(t.col, '-', -2) num3 
     , SUBSTRING_INDEX(t.col, '.', -2) num4 
     , SUBSTRING_INDEX(t.col, '-', -1) num5 
     , SUBSTRING_INDEX(t.col, '.', -1) num6 
    from Table1 t 
) t; 
-- 

|    col | n1 | n2 | n3 | n4 | n5 | n6 | 
|------------------|----|----|----|----|----|----| 
| XYZ-1.0-7.0-1 | 1 | 0 | 7 | 0 | 1 | 0 | 
| XYZ-1.0-27.0-5.7 | 1 | 0 | 27 | 0 | 5 | 7 | 
| XYZ-1.0-20.0-4.6 | 1 | 0 | 20 | 0 | 4 | 6 | 
| XYZ-1.0-10.0-2.4 | 1 | 0 | 10 | 0 | 2 | 4 | 

http://sqlfiddle.com/#!9/d3770/1

Verwenden Sie die Teile sortieren Ihr Ergebnis fo:

select t.col 
from (
    select t.col 
     , SUBSTRING_INDEX(t.col, '-', 1) str 
     , SUBSTRING_INDEX(t.col, '-', -3) num1 
     , SUBSTRING_INDEX(t.col, '.', -3) num2 
     , SUBSTRING_INDEX(t.col, '-', -2) num3 
     , SUBSTRING_INDEX(t.col, '.', -2) num4 
     , SUBSTRING_INDEX(t.col, '-', -1) num5 
     , SUBSTRING_INDEX(t.col, '.', -1) num6 
    from Table1 t 
) t 
order by str 
    , cast(num1 as unsigned) 
    , cast(num2 as unsigned) 
    , cast(num3 as unsigned) 
    , cast(num4 as unsigned) 
    , cast(num5 as unsigned) 
    , cast(num6 as unsigned) 

http://sqlfiddle.com/#!9/d3770/2

Sie c ein beseitigen auch die Unterabfrage:

select t.col 
from Table1 t 
order by SUBSTRING_INDEX(t.col, '-', 1) 
    , cast(SUBSTRING_INDEX(t.col, '-', -3) as unsigned) 
    , cast(SUBSTRING_INDEX(t.col, '.', -3) as unsigned) 
    , cast(SUBSTRING_INDEX(t.col, '-', -2) as unsigned) 
    , cast(SUBSTRING_INDEX(t.col, '.', -2) as unsigned) 
    , cast(SUBSTRING_INDEX(t.col, '-', -1) as unsigned) 
    , cast(SUBSTRING_INDEX(t.col, '.', -1) as unsigned) 

http://sqlfiddle.com/#!9/d3770/5

+0

Wenn wir "XYZ-1.1-7.0-1" hinzufügen, sollte es unten sein. – steven

+0

@steven - OK, ich erkannte, dass das Muster nicht so klar ist, wie ich dachte. "XYZ-1.1-7.0-1" fehlt die letzte Nummer. Ohne den letzten Punkt ('.') wird meine Lösung nicht funktionieren, weil ich die Punkte von rechts nach links zähle.Also, was ist dein Muster? –

+0

Wie in Frage, das ist mein Muster. Besteht aus ". And -". Aber in irgendeinem Format von Ziffern. – steven