2013-05-04 44 views
5

Hi Tôi muốn sắp xếp một bảng .Công trường chứa số, chữ cái và số với bảng chữ cái tức,Cần giúp đỡ để sắp xếp trong mysql

 
1 
2 
1a 
11a 
a 
6a 
b 

Tôi muốn sắp xếp này để,

 
1 
1a 
2 
6a 
11a 
a 
b

mã của tôi là,

SELECT * FROM t ORDER BY CAST(st AS SIGNED), st
Nhưng kết quả là,

 
a 
b 
1 
1a 
2 
6a 
11a 

tôi tìm thấy mã này trong url này

" http://www.mpopp.net/2006/06/sorting-of-numeric-values-mixed-with-alphanumeric-values/ "
Bất cứ ai cũng vui lòng giúp tôi

+0

Trước hết hãy kiểm tra xem CAST đang quay trở lại. Tôi nghĩ rằng nó sẽ chuyển đổi st thành một số. Chạy truy vấn này: CHỌN CAST (st AS SIGNED) TỪ –

+0

@ asim-ishaq Nó trả về số chỉ. Kết quả là 1,12,11,6,1,2,0,0 –

+0

cho bảng chữ cái nó sẽ trả về 0 để chúng luôn luôn đứng đầu. chúng ta phải suy nghĩ về một logic khác nhau –

Trả lời

5

Điều này sẽ thực hiện theo thứ tự sắp xếp theo yêu cầu của bạn, ngay cả khi có mặt 0 trong bảng;

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

An SQLfiddle to test with.

  • Là tiêu chí sắp xếp đầu tiên, nó phân loại mọi thứ bắt đầu bằng chữ cái sau bất kỳ thứ gì không. Đó là những gì regexp làm.
  • Là tiêu chí sắp xếp thứ hai, nó sắp xếp theo giá trị số mà chuỗi bắt đầu bằng (st+0 thêm 0 vào phần số bắt đầu bằng và trả về một số)
  • Như một phương sách cuối cùng, nó sắp xếp theo chuỗi lấy thứ tự chữ cái theo thứ tự.
+0

Perfecto! Joachim có thể vui lòng giải thích cách nó hoạt động? :) –

+0

yes đây là câu trả lời đúng, +1 :) tôi đã không xem xét thực tế là có thể có một số 0 – fthiella

+0

@Vivek Thêm một lời giải thích nhỏ, cho tôi biết nếu tôi cần phải làm rõ :) –

-3

tôi đã làm thay đổi nhỏ trong truy vấn của bạn -

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

này nên làm việc. theo lý thuyết cú pháp của bạn nên hoạt động nhưng không chắc tại sao mysql không chấp nhận các phương thức này sau từ thẻ. do đó tạo trường tạm thời và sau đó sắp xếp trường đó.

Điều này sẽ hoạt động theo kinh nghiệm của tôi và bạn có thể kiểm tra.

SQL FIDDLE

+0

Nó trả về số duy nhất. Các ô được gán là 0,0,1,2,6,11,12 –

+1

Không hoạt động cho 'a', 'b' vv. Nó không hoạt động cho thuần túy số ngày. –

+0

Nhu cầu của Vivek là số alpha không chỉ là số. –

0

Lý do mà bạn đang nhận được sản lượng này là tất cả các nhân vật như 'a', 'b' vv được chuyển đổi thành '0' và nếu bạn sử dụng trật tự bởi ASC nó sẽ xuất hiện ở phía trên .

SELECT CAST(number AS SIGNED) from tbl 

đang trở lại

1 
2 
1 
11 
0 
6 
0 

Nhìn vào fiddle này: - SQL FIDDLE

+0

Bạn đúng nhưng điều này không cung cấp giải pháp! – hims056

2

Bạn có thể sử dụng này:

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

Sử dụng st+0 cột varchar sẽ được đúc để int. Sắp xếp theo st+0=0 sẽ đặt hàng chữ và số ở dưới cùng (st + 0 = 0 sẽ là 1 nếu chuỗi bắt đầu bằng ký tự chữ và số, ngược lại nó sẽ là 0)

Vui lòng xem fiddle here.

+0

cảm ơn bạn. –

+1

@NavaneethaNair bạn được chào đón nhưng hãy kiểm tra câu trả lời Joachim Isaksson, câu trả lời của anh ấy hoạt động ngay cả khi có 0 trong lĩnh vực của bạn, trong khi tôi sẽ đặt 0 ở phía dưới – fthiella

Các vấn đề liên quan