SubQuery, Aggregate dan Left Join
Pada artikel ini, kita akan membahas mengenai subQuery di dalam from clause. Subquery akan mengembalikan sebuah tabel sementara yang dapat kita gunakan untuk proses query berikutnya. Berikut ini adalah contoh kasus penggunaan subquery.
Diberikan table MsMember berikut ini :
Tabel tersebut menyimpan data setiap member beserta upline dari setiap member tersebut. bagaimana jika dari tabel di atas, kita ingin menampilkan data seperti ini :
Dari tabel di atas, kita ingin menampilkan berapa jumlah downline yang dimiliki oleh setiap member. Untuk member yang tidak memiliki downline, maka akan tampil nilai 0. Untuk mengatasi hal ini, kita dapat menggunakan subquery, aggregate (count function) dan ifnull seperti di bawah ini :
Untuk subquery, saya melakukan select kepada msmember dengan menggunakan fungsi count. Hal ini berarti program akan menghitung total idupline yang ada. Kemudian saya juga mengambil field upline pada subquery ini. Field ini digunakan untuk menyamakan id dengan tabel msmember yang saya select sebelumnya.
Hal yang perlu diperhatikan berikutnya adalah karena kita menggunakan aggregate, maka kita harus menggunakan group by juga bagi field yang tidak terkena aggregate. Subquery ini :
akan menghasilkan tabel berikut :
Artinya member dengan uplineid 0 hanya ada 1 orang
Member dengan uplineid 1 ada 3 orang (memberid=1 memiliki 3 orang downline)
Member dengan uplineid 2 ada 1 orang (memberid=2 memiliki 1 orang downline)
Tabel subquery yang sudah didapatkan ini akan digabungkan dengan tabel msmember.
Untuk menggabungkan kedua tabel di atas, kita menggunakan left join, dengan tujuan agar semua member dapat ditampilkan. Jika kita hanya menggunakan join, maka member yang tidak memiliki downline tidak akan keluar namanya, hal ini dikarenakan join hanya menampilkan data jika semua MemberId pada tabel kiri dan uplineid pada tabel kanan memiliki value yang sama.
on a.MemberId = sub.upline
syntax ini akan melakukan pengecekan memberid di tabel kiri (msmember), disatukan dengan uplineid di tabel kanan (hasil subquery), sehingga menghasilkan tabel seperti yang kita inginkan.