Thứ tự nhiều cột SQL


635

Tôi đang cố gắng sắp xếp theo nhiều cột trong SQL và theo các hướng khác nhau. column1sẽ được sắp xếp giảm dần, và column2tăng dần.

Tôi có thể làm cái này như thế nào?


85
Đây là kết quả đầu tiên của "câu trả lời". Ít nhất đó là khi tôi googled "sql order by hai cột". Đó là một địa ngục dễ đọc hơn nhiều so với trang tài liệu chính thức tương đương thậm chí không xuất hiện trong trang kết quả đầu tiên của tôi cho đến khi tôi thay đổi truy vấn của mình thành "mysql 'order by'"
Andrew Martin

11
Với mức độ thường xuyên một câu hỏi SO xuất hiện trên Google, tôi luôn thấy thật tệ khi mọi người trả lời nó. SO có ở đây để trả lời hay không và tôi không thể hiểu tại sao điều hướng lưu lượng truy cập trang web đi xa lại là điều tốt
user001

Câu trả lời:


1023
ORDER BY column1 DESC, column2

Điều này sắp xếp mọi thứ theo column1(giảm dần) trước, và sau đó column2(tăng dần, là mặc định) bất cứ khi nào các column1trường cho hai hoặc nhiều hàng bằng nhau.


2
Ở đây làm thế nào để đặt hàng cột1 hoặc cột2?
PoliDev

@PoliDev, Nó đặt hàng đầu tiên theo cột1 theo thứ tự DESCending và theo cột2 (theo thứ tự ASCending)
zaheer

110
Để rõ ràng, điều này sắp xếp mọi thứ column1trước và sau đó column2bất cứ khi nào các column1trường cho hai hàng bằng nhau.
Nick Benes

2
Nó sẽ hoạt động cho bất kỳ số lượng biểu thức nào ( không chỉ các cột), đến giới hạn RDBMS của bạn.
Ignacio Vazquez-Abrams

2
@NickBenes ... hoặc bạn có thể nói: nó sắp xếp theo column2và sau đó thực hiện sắp xếp ỔN ĐỊNH theo column1. Điều này rõ ràng hơn cho những người biết phân loại ổn định là gì.
Atom

356

Các câu trả lời khác thiếu một ví dụ cụ thể, vì vậy ở đây nó đi:

Cho bảng người sau :

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826

Nếu bạn thực hiện truy vấn dưới đây:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

Tập kết quả sẽ như thế này:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706

23
Câu trả lời này là một bổ sung tuyệt vời cho câu trả lời rất hữu ích và ngắn gọn được chấp nhận.
enderland

3
Đây là một ví dụ điển hình, nhiều người nghĩ rằng làm thế nào bạn có thể sắp xếp 2 cột cùng một lúc mà thực tế không xảy ra ngay cả khi bạn đặt 2 cột cho truy vấn đơn hàng
Muhammad Faraz

Nó cung cấp kết quả tương tự khi chúng tôi sắp xếp với ba cột và thứ tự sắp xếp cột đầu tiên giống nhau và phần còn lại mọi thứ đều khác nhau. Vd: 1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc Có cách nào chúng ta có thể khắc phục điều này không?
Paramesh Korrakuti

1
@ParameshKorrakuti: Đó là kết quả mong đợi. Thứ tự kết quả trong ví dụ của bạn sẽ chỉ khác nhau nếu có FirstName, LastNamecác mục trùng lặp khác biệtYearOfBirth
Thomas CG de Vilhena

Cảm ơn ví dụ, nó làm cho những người như tôi hiểu.
thippu


19

Thứ tự nhiều cột phụ thuộc vào cả hai giá trị tương ứng của cột: Dưới đây là ví dụ bảng của tôi trong đó có hai cột được đặt tên bằng Bảng chữ cái và Số và các giá trị trong hai cột này là thứ tự ascdesc .

nhập mô tả hình ảnh ở đây

Bây giờ tôi thực hiện Order By trong hai cột này bằng cách thực hiện lệnh bên dưới:

nhập mô tả hình ảnh ở đây

Bây giờ một lần nữa tôi chèn các giá trị mới vào hai cột này, trong đó giá trị Bảng chữ cái theo thứ tự ASC :

nhập mô tả hình ảnh ở đây

và các cột trong bảng Ví dụ trông như thế này. Bây giờ một lần nữa thực hiện các hoạt động tương tự:

nhập mô tả hình ảnh ở đây

Bạn có thể thấy các giá trị trong cột đầu tiên theo thứ tự desc nhưng cột thứ hai không theo thứ tự ASC.


cũng chèn dữ liệu này (g, 10),(g,12). Sau đó, chạy lệnh bằng của bạn truy vấn, bạn sẽ có được cột thứ hai là ASCthứ tự (mà phương tiệng-10,g-11,g-12)
Pugal

6

Bạn có thể sử dụng nhiều thứ tự trên nhiều điều kiện,

ORDER BY 
     (CASE 
        WHEN @AlphabetBy = 2  THEN [Drug Name]
      END) ASC,
    CASE 
        WHEN @TopBy = 1  THEN [Rx Count]
        WHEN @TopBy = 2  THEN [Cost]
        WHEN @TopBy = 3  THEN [Revenue]
    END DESC 

Việc lập chỉ mục có hoạt động không, nếu tôi sử dụng "TRƯỜNG HỢP" bên trong "ĐẶT HÀNG B" NG "?
Rousonur Jaman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.