Pesan tabel MySQL dengan dua kolom

228

Bagaimana cara saya mengurutkan tabel MySQL dengan dua kolom?

Yang saya inginkan adalah artikel diurutkan berdasarkan peringkat tertinggi terlebih dahulu, kemudian tanggal terbaru. Sebagai contoh, ini akan menjadi output sampel (# kiri adalah peringkat, lalu judul artikel, lalu tanggal artikel)

50 | Artikel ini mengguncang | 4 Februari 2009
35 | Artikel ini cukup bagus | 1 Februari 2009
5 | Artikel ini tidak terlalu panas | 25 Jan 2009

SQL relevan yang saya gunakan adalah:

ORDER BY article_rating, article_time DESC

Saya dapat mengurutkan berdasarkan satu atau yang lain, tetapi tidak keduanya.

billynoah
sumber

Jawaban:

480

Penyortiran default naik, Anda perlu menambahkan kata kunci DESC ke kedua pesanan Anda:

ORDER BY article_rating DESC, article_time DESC
truppo
sumber
Aneh. Ketika saya memiliki dua kolom, nama dan total dan ingin memesan menurut abjad berdasarkan nama dan DESC dengan total, maka saya hanya melihat, bahwa itu dipesan berdasarkan nama, tetapi tidak secara total
Eugene
Saya telah meretas dengan (-1) * field1, field2 tanpa alasan pada bidang numerik ... terima kasih.
Asad Hasan
hahaha .... bukan permintaan yang bagus, karena jika Anda mencoba, tidak pernah dapat menyusun ulang kategori nilai "kosong" ... percobaan yang bagus di tahun 2009 .. tetapi pada tahun 2015 tidak berfungsi dengan benar;), yang benar adalah "3 "atau" 2 "sub kueri
delive
Kueri seperti itu tidak berfungsi dalam kasus saya .. Pada kasus ini, saya tidak dapat menyortir untuk Kota pilih Kota yang berbeda, Negara dari pesanan pelanggan menurut Country desc, City desc;
Pra_A
4
Saya tidak tahu mengapa ini dicentang sebagai jawaban tetapi tidak. Ini mengurutkan berdasarkan kolom pertama kemudian kolom kedua tetapi tidak keduanya sekaligus.
Aidonsnous
34
ORDER BY article_rating, article_time DESC

akan mengurutkan berdasarkan article_time hanya jika ada dua artikel dengan peringkat yang sama. Dari semua yang dapat saya lihat dalam contoh Anda, inilah yang terjadi.

 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.

tapi pertimbangkan:

 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.
Tomalak
sumber
Jawaban ini membantu saya.
Terima kasih @Talalak
12
ORDER BY article_rating ASC , article_time DESC

DESCpada akhirnya akan mengurutkan berdasarkan kedua kolom turun. Anda harus menentukan ASCjika Anda menginginkannya sebaliknya

Belajar
sumber
8

Ini mungkin membantu seseorang yang mencari cara untuk mengurutkan tabel dengan dua kolom, tetapi secara paralel. Ini berarti menggabungkan dua jenis menggunakan fungsi penyortiran agregat. Ini sangat berguna ketika misalnya mengambil artikel menggunakan pencarian teks lengkap dan juga mengenai tanggal penerbitan artikel.

Ini hanya contoh, tetapi jika Anda menangkap idenya, Anda dapat menemukan banyak fungsi agregat untuk digunakan. Anda bahkan dapat menimbang kolom untuk memilih satu di atas detik. Fungsi saya mengambil ekstrem dari kedua jenis, sehingga baris paling dihargai ada di atas.

Maaf jika ada solusi yang lebih sederhana untuk melakukan pekerjaan ini, tetapi saya belum menemukan.

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
Jiri Fornous
sumber
34
oh my god kenapa kamu memposting kode seperti itu untuk pertanyaan sederhana.
Ben Sinclair
4

Berikut ini akan memesan data Anda tergantung pada kedua kolom dalam urutan menurun.

ORDER BY article_rating DESC, article_time DESC
Ivan
sumber
3
Bagaimana salinan jawaban yang diterima 4 tahun kemudian menerima banyak upvotes ini?
Stack Underflow
mungkin karena penjelasan: P
Rizwan Haider