Đặt một bảng MySQL theo hai cột


228

Làm cách nào để sắp xếp một bảng MySQL theo hai cột?

Những gì tôi muốn là các bài viết được sắp xếp theo xếp hạng cao nhất trước, sau đó là ngày gần đây nhất. Ví dụ: đây sẽ là một đầu ra mẫu (bên trái # là xếp hạng, sau đó là tiêu đề bài viết, sau đó là ngày bài viết)

50 | Bài viết này đá | Ngày 4 tháng 2 năm 2009
35 | Bài viết này là khá tốt | Ngày 1 tháng 2 năm 2009
5 | Điều này không quá nóng | Ngày 25 tháng 1 năm 2009

SQL có liên quan tôi đang sử dụng là:

ORDER BY article_rating, article_time DESC

Tôi có thể sắp xếp theo cái này hay cái khác, nhưng không phải cả hai.

Câu trả lời:


480

Sắp xếp mặc định là tăng dần, bạn cần thêm từ khóa DESC vào cả hai đơn hàng của mình:

ORDER BY article_rating DESC, article_time DESC

Lạ Khi tôi có hai cột, tên và tổng số và muốn sắp xếp theo thứ tự bảng chữ cái theo tên và DESC theo tổng số, thì tôi chỉ thấy rằng nó được sắp xếp theo tên, nhưng không phải theo tổng số
Eugene

Tôi đã hack với (-1) * field1, field2 mà không có lý do gì trên các trường số ... cảm ơn.
Asad Hasan

hahaha .... không phải là một truy vấn tốt, bởi vì nếu bạn cố gắng, không bao giờ có thể sắp xếp lại danh mục giá trị "trống" ... thử tốt trong năm 2009 .. nhưng năm 2015 không hoạt động chính xác;), đúng là "3 Truy vấn phụ "hoặc" 2 "
delive

Truy vấn như vậy không hoạt động trong trường hợp của tôi .. Trong trường hợp này, tôi không nhận được sắp xếp cho Thành phố chọn Thành phố, Quốc gia khác nhau từ khách hàng đặt hàng theo Quốc gia desc, Thành phố desc;
Pra_A

4
Tôi không biết tại sao điều này được kiểm tra như câu trả lời nhưng nó không phải là. Nó sắp xếp theo cột đầu tiên sau đó là cột thứ hai nhưng không phải cả hai cùng một lúc.
viện trợ

34
ORDER BY article_rating, article_time DESC

sẽ sắp xếp theo article_time chỉ khi có hai bài viết có cùng đánh giá. Từ tất cả những gì tôi có thể thấy trong ví dụ của bạn, đây chính xác là những gì xảy ra.

 primary sort                         secondary sort 
1.  50 | This article rocks          | Feb 4, 2009    3.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

nhưng hãy xem xét:

 primary sort                         secondary sort 
1.  50 | This article rocks          | Feb 2, 2009    3.
1.  50 | This article rocks, too     | Feb 4, 2009    4.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

Câu trả lời này đã giúp tôi. Cảm ơn @Tomalak
Jayani Sumudini

12
ORDER BY article_rating ASC , article_time DESC

DESCở cuối sẽ sắp xếp theo cả hai cột giảm dần. Bạn phải xác định ASCnếu bạn muốn nó khác


8

Điều này có thể giúp ai đó đang tìm cách sắp xếp bảng theo hai cột, nhưng theo cách song song. Điều này có nghĩa là kết hợp hai loại bằng cách sử dụng chức năng sắp xếp tổng hợp. Nó rất hữu ích khi ví dụ truy xuất các bài viết bằng cách sử dụng tìm kiếm toàn văn bản và cũng liên quan đến ngày xuất bản bài viết.

Đây chỉ là ví dụ, nhưng nếu bạn nắm bắt được ý tưởng, bạn có thể tìm thấy rất nhiều hàm tổng hợp để sử dụng. Bạn thậm chí có thể cân các cột để thích hơn một giây. Hàm của tôi lấy cực trị từ cả hai loại, do đó các hàng có giá trị nhất nằm ở trên cùng.

Xin lỗi nếu có giải pháp đơn giản hơn để thực hiện công việc này, nhưng tôi chưa tìm thấy.

SELECT
 `id`,
 `text`,
 `date`
 FROM
   (
   SELECT
     k.`id`,
     k.`text`,
     k.`date`,
     k.`match_order_id`,
     @row := @row + 1 as `date_order_id`
     FROM
     (
       SELECT
         t.`id`,
         t.`text`,
         t.`date`,
         @row := @row + 1 as `match_order_id`
         FROM
         (
           SELECT
             `art_id` AS `id`,
             `text`   AS `text`,
             `date`   AS `date`,
             MATCH (`text`) AGAINST (:string) AS `match`
             FROM int_art_fulltext
             WHERE MATCH (`text`) AGAINST (:string IN BOOLEAN MODE)
             LIMIT 0,101
         ) t,
         (
           SELECT @row := 0
         ) r
         ORDER BY `match` DESC
     ) k,
     (
       SELECT @row := 0
     ) l
     ORDER BY k.`date` DESC
   ) s
 ORDER BY (1/`match_order_id`+1/`date_order_id`) DESC

34
trời ơi tại sao bạn lại đăng mã như vậy cho một câu hỏi đơn giản như vậy.
Ben Sinclair

4

Sau đây sẽ sắp xếp dữ liệu của bạn tùy thuộc vào cả hai cột theo thứ tự giảm dần.

ORDER BY article_rating DESC, article_time DESC

3
Làm thế nào để một bản sao của câu trả lời được chấp nhận 4 năm sau nhận được nhiều upvote này?
Stack Underflow

có thể là do giải thích: P
Rizwan Haider
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.