2013-05-04 24 views
5

Hi Chcę, aby posortować tabelę .Powierzchnia pole zawiera cyfr, liter i cyfr z alfabetów tjPotrzebujesz pomocy dla rodzaju w mysql

 
1 
2 
1a 
11a 
a 
6a 
b 

Chcę uporządkować to,

 
1 
1a 
2 
6a 
11a 
a 
b

Mój kod jest

SELECT * FROM t ORDER BY CAST(st AS SIGNED), st
Ale wynik jest

 
a 
b 
1 
1a 
2 
6a 
11a 

znalazłem ten kod w tym adresem

" http://www.mpopp.net/2006/06/sorting-of-numeric-values-mixed-with-alphanumeric-values/ "
ktoś proszę mi pomóc

+0

Przede wszystkim sprawdź, co zwraca CAST. Myślę, że zamieni st na liczbę. Uruchom tę kwerendę: SELECT CAST (st AS SIGNED) Z t –

+0

@ asim-ishaq Zwraca tylko liczby.Opcja jest 1,12,11,6,1,2,0,0 –

+0

dla alfabetów zwróci 0, więc oni zawsze przychodzą na wierzch. musimy myśleć o innej logice –

Odpowiedz

5

Wykonałoby to wymaganą kolejność sortowania, nawet w obecności 0 w tabeli;

SELECT * FROM t 
ORDER BY 
    st REGEXP '^[[:alpha:]].*', 
    st+0, 
    st 

An SQLfiddle to test with.

  • jako pierwsze kryterium sortowania jest sortowanie niczego, który rozpoczyna się od litery po wszystko, co nie. To właśnie robi regexp.
  • jako drugie kryterium sortowania sortuje według wartości liczbowej ciąg rozpoczyna się (st+0 dodaje 0 do części numerycznej ciąg rozpoczyna się i zwraca int)
  • W ostateczności, to sortuje według napisu się do uporządkuj alfabetycznie.
+0

Perfecto! Joachim można wyjaśnić, jak to działa? :) –

+0

tak, to jest poprawna odpowiedź, +1 :) nie brałem pod uwagę faktu, że może być jakiś 0 – fthiella

+0

@Vivek Dodano małe wyjaśnienie, daj mi znać, jeśli muszę wyjaśnić :) –

-3

zrobiłem małą zmianę w zapytaniu -

SELECT *, CAST(st AS SIGNED) as casted_column 
FROM t 
ORDER BY casted_column ASC, st ASC 

to powinno działać. Teoretycznie twoja składnia powinna działać, ale nie wiesz, dlaczego mysql nie akceptuje tych metod po tagu. tak utworzone pole temp, a następnie posortowane, które.

To powinno działać zgodnie z moimi doświadczeniami, i możesz je sprawdzić.

SQL FIDDLE

+0

Zwraca tylko liczby. Kolumna casted zawiera 0,0,1,2,6,11,12 –

+1

Nie działa dla "a", "b" itp. Nie działa dla czystego data numeryczna. –

+0

Vivek jego potrzeby jest alfanumeryczny nie tylko numeryczny .. –

0

Powodem, że są coraz to wyjście jest to, że cała postać jak „a”, „b” etc są konwertowane na „0”, a jeśli używasz zamówienie ASC pojawi się on na szczycie .

SELECT CAST(number AS SIGNED) from tbl 

wraca

1 
2 
1 
11 
0 
6 
0 

Spójrz na to ryba: - SQL FIDDLE

+0

Masz rację, ale to nie zapewnia rozwiązania! – hims056

2

Można to wykorzystać:

SELECT * 
FROM t 
ORDER BY 
    st+0=0, st+0, st 

Korzystanie st+0 kolumna varchar będzie rzutować na int. Zamawianie przez st+0=0 położy wiersze alfanumerycznych na dole (st + 0 = 0 będzie 1 czy ciąg rozpoczyna się od znaku alfanumerycznego, oterwise będzie 0)

proszę zobaczyć skrzypce here.

+0

dziękuję. Działa. –

+1

@NavaneethaNair nie ma za co, ale proszę sprawdź odpowiedź Joachima Isakssona, jego odpowiedź działa, nawet jeśli w twoim polu jest 0, podczas gdy mój umieści 0 na dole – fthiella

Powiązane problemy