Saturday, 28 June 2014

Mengurutkan data pada MySQL (2)


Tulisan ini merupakan lanjutan dari:
Mengurutkan data pada MySQL

Masih seputar mengurutkan data. Sebelumnya dengan menggunakan queri hasil yang didapat sesuai gambar berikut :
Gambar 1. Queri masih belum sempurna


Dapat dilihat bahwa urutan masih belum sempurna, seperti 2.80 lebih dulu dibanding 2.9. Dengan mengabaikan angka 2 didepannya, seharusnya angka 9 memperoleh posisi lebih dulu. Belum lagi pada id berkepala 2 (mudah-mudahan nggak serem kata-katanya :P ) seperti nomor 2.80.3, 2.80.25, dan 2.80.50 yang seharusnya urut seperti ini, bukan 25,3,50 yang masih berdasarkan karakter. Untuk itu kita akan menyempurnakannya.

Pertama kita ambil nilai sebelum titik atau keselurahan pada id yang tidak ada titik. Selanjutnya nilai pertama ini dibuat dua tipe, yaitu char dan integer. Sehingga tampak seperti gambar berikut :
Gambar 2. Pemisahan nilai pertama menjadi 2 tipe (id_c, id_i)

Perhatikan gambar diatas, terdapat 2 field yaitu id_c (char) dan id_i (integer). id_c, merupakan hasil dari pemotongan nilai sebelum titik pertama atau nilai keseluruhan pada yang tidak bertitik. id_i, sama seperti id_c hanya saja nilainya dikonversi ke integer. Lalu selanjutnya adalah nilai setelah titik pertama dan titik kedua. Lalu bagaimana prosesnya? Yang kita perlukan adalah posisi titik pertama dan kedua. Untuk mendapatkannya kita pergunakan fungsi LOCATE() :
.

  locate('.',idnomor) as pos1,
  locate('.',idnomor,locate('.',idnomor)+1) as pos2,
  length(idnomor) as fLen
   
.

Perhatikan kode diatas terdapat beberapa field baru lagi yaitu pos1, pos2, dan fLen (singkatan dari fix length, atau panjang yang tetap untuk keperluan selanjutnya). Parameter pertama pada fungsi locate diisi dengan string yang akan dicari. Parameter kedua adalah field atau string utama, sedangkan parameter ketiga adalah posisi yang akan dimulai untuk proses pencarian (dapat diisi atau tidak). Pos1 untuk titik pertama, dan pada pos2 kita mulai pencarian setelah posisi titik pertama (parameter ketiga). Jika tidak ditemukan nilainya akan 0. Setelah posisi titik atau pemisah ini diketahui, selanjutnya menampilkan mengambil nilai kedua dan ketiga dengan fungsi MID(), disertai dengan fungsi IF() agar nilai yang didapat sesuai. Dan pada contoh ini juga menggunakan subquery agar mendapatkan hasil yang diinginkan dengan kode yang lebih rapi. Selain itu subquery juga berguna untuk proses selanjutnya, yaitu penggunaan fungsi MID(). Kode untuk mengambil nilai kedua dan ketiga :
.

SELECT m.*,
  mid(idnomor,if( pos1>0, pos1+1,0),if(pos2>0,pos2-pos1-1,fLen)) as id2_c,
  mid(idnomor,if( pos2>0, pos2+1,fLen+1)) as id3_c
FROM
  (SELECT idnomor, 
  ...

.

Dengan fungsi MID dan field pos1, pos2, dan fLen serta fungsi IF kita memperoleh nilai-nilai kedua dan ketiga. Selanjutnya kita lakukan subquery lagi agar nilai dari id2_c dan id3_c dapat dikonversi menjadi id2_i dan id3_i. Tanpa subquery tetap dapat nilai yang diinginkan hanya saja kita akan memanggil kode untuk mencari nilai id2_c sebanyak dua kali lalu mengkonversi-nya. Jika sudah semua selanjutnya lakukan pengurutan seperti berikut :
.

ORDER BY
  id_i,  id_c,
  id2_i, id2_c,
  id3_i, id3_c

.

Berikut hasil yang akan diperoleh :
Gambar 3. Hasil akhir

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