Friday, 6 June 2014

Mengurutkan data pada MySQL


Dalam program database mengurutkan data adalah sesuatu yang wajib. Dalam bahasa SQL , kata kunci yang digunakan adalah "ORDER BY". Contoh :
.

/*queri 1*/
SELECT * FROM mytable m ORDER BY idnomor ASC

/*queri 2*/
SELECT * FROM mytable m ORDER BY idnomor DESC

.
Pada contoh ini data type untuk field idnomor adalah integer. Queri 1 akan mengurutkan secara Ascending (ASC) yaitu dimulai dari yang terkecil. Sedangkan Descending (DESC) kebalikannya ASC dimulai dari yang terbesar. Secara default jika kita tidak menambahkan ASC atau DESC maka pengurutan akan secara ascending. Pada contoh diatas field idnomor bertipe INTEGER yaitu bilangan bulat, lalu bagaimana jika bertipe string (VARCHAR)? Perhatikan contoh berikut :
.

data pada idnomor

id nomor
--------
1
2
3
4
5
6
7
8
9
10

selanjutnya kita urutkan dengan menggunakan queri 1 diatas. Hasilnya akan seperti berikut :

1
10
2
3
4
5
6
7
8
9

.

Gambar 1. Pengurutan pada tipe data string (VARCHAR)

Perhatikan bahwa ID dengan nomor 10 menempati nomor urut kedua setelah angka 1. Ini karena pengurutan berdasarkan string atau karakter dimana 10 lebih dulu dari 2. Program membaca karakter pertama terlebih dahulu lalu dilanjutkan dengan karakter selanjutnya. Untuk itu kita perlu perbaiki queri kita agar didapat hasil yang diinginkan. Dalam hal ini kita perlu mengkonversi string menjadi integer, berikut querinya :
.

SELECT idnomor, CAST(idnomor as signed) as nourut
FROM mytable m order by nourut ASC

.

Gambar 2. Konversi tipe data untuk pengurutan

Fungsi CAST akan mengubah tipe data idnomor sesuai tipe yang diinginkan, dalam hal ini adalah signed integer (signed = bilangan bulat dengan nilai negatif dan positif). Berikut ini tipe yang didukung oleh MySQL :
  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]
Sekarang kita ubah sedikit data pada table kita menjadi :
.

1
10
2
2a
2c
22d
6
2h
8
9

hasil yang akan diperoleh dengan queri : 
SELECT idnomor, cast(idnomor as signed) as nourut
FROM mytable m order by nourut ASC

1
2h
2c
2a
2
6
8
9
10
22d

.

Perhatikan bahwa 2h lebih dulu daripada 2c atau 2a. Hal ini terjadi karena saat konversi tipe data dari string ke integer, MySQL mengabaikan karakter selanjutnya jika menemukan karakter selain angka (0-9). Sehingga 2h, 2c, dan 2a dianggap memiliki nomor urut 2, hasil yang ditampilkan mungkin memiliki nomor urut yang berbeda misal 2c dulu atau 2a terlebih dahulu. Untuk memperbaiki queri kita tambahkan urutan order menjadi :
.

SELECT idnomor, cast(idnomor as signed) as nourut
FROM mytable m order by nourut DESC, idnomor ASC

.

Gambar 3. Mengurut 2 field

Kita juga dapat mengurutkan dengan masing-masing ketentuan, contoh urutan field pertama secara ascending lalu yang kedua descending dst. Selanjutnya kita lanjutkan pengurutan untuk data dengan format tertentu, contoh data yang ada :
.

data dalam field idnomor, table myTable :

2.8.3
10
2.24
22d
2.1a
2.10c
2h
2.8
2.8.50
2.8.25

hasil yang diperoleh jika menggunakan queri sebelumnya : 

2.10c
2.1a
2.24
2.8
2.8.25
2.8.3
2.8.50
2h
10
22d

.

Gambar 4. Pengurutan pada format data tertentu


Hal ini terjadi karena setelah konversi string ke angka, pengurutan selanjutnya berdasarkan string. Untuk mengakali-nya kita perlu string setelah titik sebagai urutan selanjutnya. Berikut querinya :
.

SELECT idnomor, cast(idnomor as signed) as nourut,
substring_index(substring_index(idnomor,'.',2),'.',-1) as nourut2
FROM mytable m order by nourut, idnomor, nourut2

.

Substring_index akan mengambil nilai pada parameter pertama (idnomor), lalu mencari karakter/string yang diinginkan pada parameter kedua ('.'), selanjutnya pada parameter ketiga diisi dengan berapa banyak kata yang diinginkan, dalam hal ini 2 kata yaitu sebelum dan sesudah titik. Akhir kata, Happy Coding! :D

- krofz

No comments:

Post a Comment

Maaf jika komentar anda lama terbitnya ^__^, penulis berusaha OL sesering mungkin. Komentar anda adalah semangat blog ini, dan juga semangat para blogger lainnya. You can use XHTML tags: <a href="" rel="link"> </a>, <strong> </strong>, <b> </b>, <em> </em>, <i> </i>.

Spesial character use :
&lt; for <
&gt; for >


Use Pastebin.com for alternative to display your code :) .

 

back to top

back to top