Bisakah saya menjalankan pernyataan pilih dan mendapatkan nomor baris jika item diurutkan?
Saya punya tabel seperti ini:
mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| orderID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| itemID | bigint(20) unsigned | NO | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
Saya kemudian dapat menjalankan kueri ini untuk mendapatkan jumlah pesanan berdasarkan ID:
SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;
Ini memberi saya hitungan masing-masing itemID
dalam tabel seperti ini:
+--------+------------+
| itemID | ordercount |
+--------+------------+
| 388 | 3 |
| 234 | 2 |
| 3432 | 1 |
| 693 | 1 |
| 3459 | 1 |
+--------+------------+
Saya ingin mendapatkan nomor baris juga, jadi saya bisa tahu itu itemID=388
adalah baris pertama, 234
kedua, dll (pada dasarnya peringkat pesanan, bukan hanya hitungan mentah). Saya tahu saya bisa melakukan ini di Jawa ketika saya mendapatkan hasil yang ditetapkan kembali, tapi saya bertanya-tanya apakah ada cara untuk menanganinya murni di SQL.
Memperbarui
Mengatur peringkat menambahkannya ke set hasil, tetapi tidak dipesan dengan benar:
mysql> SET @rank=0;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
-> FROM orders
-> GROUP BY itemID ORDER BY rank DESC;
+------+--------+------------+
| rank | itemID | ordercount |
+------+--------+------------+
| 5 | 3459 | 1 |
| 4 | 234 | 2 |
| 3 | 693 | 1 |
| 2 | 3432 | 1 |
| 1 | 388 | 3 |
+------+--------+------------+
5 rows in set (0.00 sec)
mysql
sql
row-number
George
sumber
sumber
ORDER BY rank ASC
(memesan berdasarkan peringkat dalam urutan ASCending). Saya kira itulah yang Anda maksudkan tetapi tidak dipesan dengan benarJawaban:
Lihatlah ini .
Ubah kueri Anda menjadi:
Pilihan terakhir adalah hitungan Anda.
sumber
ORDER BY ordercount DESC
, dan kemudian bungkus seluruh kueri di yang lainSELECT
yang mendapatkan semuanya dari yang pertama, tetapi pesan berdasarkan kolom peringkat (0 dalam kasus ini).sumber
t1
dant2
?x
dany
.Solusi Swamibebop bekerja, tetapi dengan memanfaatkan
table.*
sintaksis, kita dapat menghindari pengulangan nama kolom dari bagian dalamselect
dan mendapatkan hasil yang lebih sederhana / lebih pendek:Jadi itu akan memberi Anda:
sumber
@r := @r + 1
dalam pernyataan pilih berfungsi, tetapi jika itu dalam prosedur tersimpan dengandeclare r int; set r = 0;
, itu mengeluh (aktifr := r +1
)?Anda dapat menggunakan variabel MySQL untuk melakukannya. Sesuatu seperti ini seharusnya bekerja (walaupun, itu terdiri dari dua pertanyaan).
sumber
order by
terjadi setelah variabel@x
telah dievaluasi. Coba bereksperimen dengan memesan menggunakan kolom lain. Juga bereksperimen dengan keduanyadesc
danasc
. Anda akan melihat bahwa berkali-kali mereka akan gagal dan satu-satunya saat itu berhasil, itu adalah keberuntungan murni karena urutan "pilih" asli Anda memiliki urutan yang sama dengan urutanorder by
. Lihat solusi saya dan / atau solusi Swamibebop.ASC
/DESC
akan mengubah urutan nomor-nomor itu diberi nomor (dari terkecil ke terbesar atau sebaliknya). Jadi sepertinya dalam kasusorder by
itu dievaluasi dulu.Sekarang sudah ada di MySQL 8.0 dan MariaDB 10.2:
sumber