Cara Mengambil Data Dari Tabel Yang Berbeda Menggunakan Inner Join

Disini saya menjelaskan dengan menggunakan MySQL serta tools dari MySQL Workbench.

Menurut w3schools, Inner Join merupakan keyword untuk memilih data (per baris) dari dua tabel yang berbeda namun tiap tabel memiliki nilai yang sama.

Berdasarkan quote diatas, kita dapat mengambil data dari tabel yang berbeda dengan menggunakan Inner Join. Bagaimana cara penggunaannya? Disini saya membuat contoh kasus dengan 3 tabel dengan gambar seperti berikut:

Struktur Relasi Antar Tabel Untuk Contoh Kasus Inner Join

Berdasarkan gambar diatas, ada beberapa tabel, yakni:

  1. Tabel user yang memiliki atribut id dan nama. Setiap user memiliki id yang berbeda-beda namun berdasarkan struktur database, nama user boleh sama. Meskipun struktur di database memperbolehkan nama untuk sama, namun kita dapat membuat program kita supaya nama tidak boleh sama.
  2. Tabel achievement yang memiliki id dan nama juga. Nama yang ada pada tabel achievement ini digunakan untuk nama dari achievement, misal “Beginner”, “Novice”, “Advanced” dan sebagainya. Setiap achievement memiliki id yang berbeda-beda namun nama bisa sama. Sama halnya seperti tabel user, kita bisa membuat program kita supaya tiap achievement memiliki nama yang berbeda-beda meskipun struktur database memperbolehkan nama achievement sama.
  3. Tabel user_achievement, sedikit berbeda dengan tabel yang lain. Tabel ini didapatkan karena adanya relasi many-to-many antara tabel user dengan tabel achievement. Tabel ini berguna untuk menyimpan achievement yang dimiliki oleh tiap user. Misal user dengan nama “Ridho” dengan id 1 memiliki 2 buah achievement, yakni achievement “Beginner” dan “Novice” maka pada tabel user_achievement akan ada 2 data, berikut ilustrasi gambarnya:
Ilustrasi Isi Tabel user_achievement

Lalu bagaimana cara mengetahui achievement yang dimiliki oleh suatu user?

Dengan menggunakan kata kunci yang telah disediakan SQL yakni “inner join” kita bisa memanggil syntax berikut untuk mendapatkan achievement yang dimiliki oleh tiap user:

SELECT * FROM user AS u INNER JOIN user_achievement AS i ON u.id = i.user_id

Syntax SQL diatas akan memunculkan hasil sebagai berikut:

Hasil Query dari SELECT * FROM user AS u INNER JOIN user_achievement AS i ON u.id = i.user_id

Penjelasan query, SELECT digunakan untuk menampilkan data. Lalu setelah SELECT ada simbol ‘*’ yang berarti kita mau menampilkan semua data tanpa terkecuali. Lalu setelah ‘*’ ada FROM user yang berarti kita ingin menampilkan semua data tanpa terkecuali dari tabel user. Lalu setelah FROM user ada AS u, penggunaan AS setelah nama tabel berarti kita memberi nama singkatan yang berupa huruf dari suatu tabel. Pada query diatas, kita memberi nama singkat pada tabel user dengan huruf ‘u’ supaya ketika kita ingin memanggil kolom dari tabel user kita tidak perlu menulis ‘user’ lagi melainkan cukup huruf ‘u’ saja. Misal kita ingin menampilkan nama user dari hasil query diatas maka kita bisa menggunakan query:

SELECT u.nama FROM user AS u INNER JOIN user_achievement AS i ON u.id = i.user_id

Setelah AS u terdapat INNER JOIN user_achievement AS i, kata kunci ini memiliki bahwa kita ingin menggabungkan antara tabel yang kita sebutkan sebelumnya (yakni user) dengan tabel user_achievement. Selain itu juga terdapat AS i, sama halnya sepeti tadi, kita ingin mempersingkat pemanggilan tabel user_achievement dengan huruf i sehingga kita menggunakan kata kunci AS setelah nama tabel. Setelah itu terdapat ON u.id = i.user_id, berbeda dengan kata kunci yang lain, kata kunci ON wajib digunakan untuk setiap penggunakan INNER JOIN. Kata kunci ON digunakan untuk memberitahu ke sql bahwa kita ingin menampilkan data dari tabel 1 dan tabel 2 yang memiliki id yang sama. Dalam kasus diatas, kita menggunakan ON untuk memberitahu ke sql bahwa kita ingin menampilkan semua data user dan user_achievement berdasarkan id dari user.

Relasi Antar Tabel

Jika dilihat kembali relasi antar tabelnya, tabel user memiliki id. Begitu pula dengan user_achievement yang memiliki id user yang bernama user_id. Lalu kita memberitahu ke query bahwa kita ingin mengambil semua data user dan user_achievement yang attribut id dari tabel user sama dengan attribut user_id dari tabel user_achievement. Sehingga didapatkan hasil query seperti gambar sebelumnya.

Hasil query diatas masih belum selesai, kenapa? Kita berhasil mendapatkan semua achievement yang dimiliki oleh semua user, namun achievement tersebut masih berupa achievement_id padahal kita ingin menampilkan nama dari achievement tersebut. Lalu bagaimana caranya menampilkan nama dari tiap achievement yang dimiliki oleh semua user? Kita bisa memanggil inner join tambahan setelah inner join lagi. Sehingga syntax menjadi seperti berikut:

SELECT * FROM user AS u INNER JOIN user_achievement AS i ON u.id = i.user_id INNER JOIN achievement AS a ON i.achievement_id = a.id

Syntax diatas memunculkan hasil sebagai berikut:

Apa yang ditambahkan dari syntax sebelumnya? Kita menambahkan syntax INNER JOIN baru sehingga hasil INNER JOIN sebelumnya kita INNER JOIN lagi. Sebelumnya, kita hanya mendapatkan achievement_id dari setiap user saja, padahal kita ingin mendapatkan nama nya saja. Lalu kita menggabungkan hasil gabungan sebelumnya sehingga sekarang kita tidak hanya mendapatkan achievement_id tetapi juga nama dan id dari tabel achievement. Lalu untuk mempercantik hasil query, kita ubah tidak menggunakan SELECT * lagi namun menjadi berikut:

SELECT u.id, u.nama, a.id, a.nama FROM user AS u INNER JOIN user_achievement AS i ON u.id = i.user_id INNER JOIN achievement AS a ON i.achievement_id = a.id

Sehingga didapatkan hasil query sebagai berikut:

Hasil query dari SELECT u.id, u.nama, a.id, a.nama FROM user AS u INNER JOIN user_achievement AS i ON u.id = i.user_id INNER JOIN achievement AS a ON i.achievement_id = a.id

Nah karena sebelumnya kita sudah memberikan nama panggilan yang singkat untuk setiap tabel, yakni u untuk user, a untuk achievement, dan i untuk user_achievement sehingga jika kita ingin memanggil salah satu tabel tersebut kita tidak perlu menulis panjang-panjang cukup memanggil huruf inisialnya saja. Diatas kita mengubah SELECT * menjadi SELECT u.id, u.nama, a.id, a.nama sehingga kita bisa mendapatkan informasi-informasi yang kita perlukan saja dari hasil query tersebut. Karena kita hanya memerlukan informasi berupa achievement dari tiap user, meskipun terkadang id dari user dan achievement tidak digunakan namun kita tetap munculkan supaya siaga bila sewaktu-waktu diperlukan.

Bagaimana cara menampilkan hasil query tersebut ke dalam program?

Nah kali ini tidak benar-benar dibuatkan programnya, melainkan dengan semacam pseudocode. Awalnya kita cukup membuat variabel yang berisi query yang telah kita buat diatas.

SELECT u.id, u.nama, a.id, a.nama FROM user AS u INNER JOIN user_achievement AS i ON u.id = i.user_id INNER JOIN achievement AS a ON i.achievement_id = a.id

Kita juga bisa mengubah query diatas sesuai kebutuhan kita, misal kita ingin menampilkan semua achievement dari user dengan nama Ridho, maka query menjadi:

SELECT u.id, u.nama, a.id, a.nama FROM user AS u INNER JOIN user_achievement AS i ON u.id = i.user_id INNER JOIN achievement AS a ON i.achievement_id = a.id WHERE u.nama = ‘Ridho’

Kita juga bisa mengubah query diatas menjadi hal yang lain tergantung dari kebutuhan kita misal berdasarkan id dari user, ataupun kita ingin menampilkan siapa saja yang memiliki achievement ‘BEGINNER’ dan sebagainya.

Setelah membuat variabel yang berisi query diatas, kita bisa memanggil perintah yang biasa kita gunakan untuk menjalakan suatu perintah SQL dengan parameter variabel yang berisi SQL diatas.

Setelah itu kita akan mendapatkan data dari hasil query diatas, maka yang perlu kita lakukan melakukan pengulangan untuk setiap data (baris) yang ada akan kita masukkan kedalam List.

Setelah itu tinggal kita munculkan ke dalam sebuah objek misal GridView ataupun ListBox.

Berikut contoh pseudocode dari penjelasan diatas:

Berdasarkan pseudocode diatas dan penjelasan sebelumnya, kita perlu membuat variabel sql untuk menampung syntax query kita. Lalu kita memanggil function untuk membaca data dan memasukkan variabel sql tersebut sebagai argumen dari function. Lalu disini ada 2 opsi, kita bisa menampung terlebih dahulu data yang mau kita tampilkan ke dalam List atau Array sehingga nantinya data dapat diolah sebelum ditampilkan dengan cara membuat variabel List lalu membuatkan variabel Class nya dan memasukkan ke dalam List yang telah kita buat sebelumnya. Atau opsi ke-2 yakni langsung menampilkan data hasil pencarian ke dalam suatu objek misalnya ListBox ataupun objek yang lain.

Sekian informasi mengenai Inner Join kali ini, semoga bermanfaat.