Arsip Tag: union

Menggabungkan Query Menggunakan Union di MySQL

ilustrasi

Prakata

Mungkin kita pernah membuat model tabel yang rumit seperti ini, tabel yang bisa memiliki atribut sama namun sengaja dipisahkan, tapi pada akhirnya kita harus menjalankan 2 query terpisah untuk memanggilnya. Sebut saja kita mempunyai tabel bukutamu dengan atribut (id, alamat_ip, nama, judul, pesan, tanggal), namun pada masa penggunaan ternyata banyak yang mengirimkan pesan spam yang tidak kita inginkan, dan solusi yang terpikir pada saat itu adalah membuat tabel spam (dengan atribut yang sama dengan tabel, tapi kita menyortir terlebih dahulu dengan filter anti-spam yang kita buat, atau mungkin menggunakan Akismet), dengan maksud agar si spam bisa ditinggalkan saat backup, dan tabel bukutamu dalam keadaan bebas spam.

Di sistem pengelolaan (backend), kita bisa melakukan query masing-masing terhadap kedua tabel untuk ditampilkan terpisah, tapi melihat dua halaman terpisah untuk maksud yang sama (dalam hal ini membedakan yang mana buku tamu dengan spam) bukanlah solusi yang bagus.

Dibuat tabel pengelolaan terpisah
kedua tabel dibuat terpisah dengan pengelolaan terpisah

Solusi

Dalam kasus seperti ini bisa dilakukan tiga solusi;

  1. Gabungkan kedua tabel secara fisik menjadi satu dan ditambah atribut (…, is_spam) sehingga nantinya query akan dibatasi dengan ‘ WHERE is_spam = 0‘ (dimana kita memilih hanya bukan spam)
  2. Gabungkan kedua tabel dalam query menggunakan UNION sehingga yang kita lakukan hanya sekali query saja
  3. Lakukan dua query untuk mengambil data dari kedua tabel dan menggabungkannya nanti di pemrograman.

Tapi sesuai judul, kita akan menggunakan pilihan nomor 2 saja.

UNION Beraksi

Jadi, setelah kita sepakat dengan memilih solusi nomor dua diatas, maka tinggal kita selesaikan dengan sihir UNION saja.
Meskipun sudah dibahas sedikit, tapi sebelum lebih jauh biar saya jelaskan tambahan mengenai UNION.
Pada dasarnya, union adalah fungsi untuk menggabungkan dua atau lebih query SELECT dalam satu hasil keluaran saja. Dengan catatan kedua query SELECT tersebut harus memiliki jumlah field yang sama.
Langsung kita coba, struktur tabel bukutamu dan spam yang saya gunakan adalah sebagai berikut

CREATE TABLE bukutamu
(
    id INT PRIMARY KEY AUTO_INCREMENT,
    alamat_ip VARCHAR(16),
    nama VARCHAR(50),
    judul VARCHAR(50),
    pesan VARCHAR(250),
    tanggal TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
)

Begitu pula dengan tabel spam, tidak ada yang dirubah selain nama tabelnya.
Untuk itu, dengan query ini…

(SELECT id, nama, judul, pesan, tanggal, '0' as is_spam FROM bukutamu)
UNION
(SELECT id, nama, judul, pesan, tanggal, '1' as is_spam FROM spam)
ORDER BY tanggal DESC;

kedua SELECT akhirnya akan bersatu dan menambahkan satu field is_spam yang bernilai 0 jika datang dari tabel bukutamu, dan bernilai 1 jika datang dari tabel spam.
Sifat normalnya UNION adalah selalu DISTINCT, jadi jika ditemukan record yang sama tidak akan ditampilkan kedua-kalinya.

pengelolaan terpusat pada satu tabel
Pengelolaan Bukutamu dan Spam disatukan

Kesimpulan

Jadi UNION berguna untuk menggabungkan beberapa query SELECT untuk menghasilkan satu keluaran saja.
Batasan/aturan yang dapat kita simpulkan diantaranya…

  • Query yang disatukan harus menghasilkan jumlah field yang sama.
  • Nilai record yang sama dalam UNION akan disatukan, dan tidak akan tampil dua kali (sama ketika kita menggunakan DISTINCT)
  • Statement ORDER menggunakan alias pada setiap SELECT, bukan nama field sebenarnya.
  • Statement ORDER (tanpa LIMIT pada salah-satu SELECT) harus disimpan di akhir, karena jika disimpan didalam salah-satu SELECT tidak akan berpengaruh.
  • Jika menggunakan statement LIMIT (dan atau ORDER), harus ditentukan didalam salah-satu SELECT atau LIMIT total.

Untuk batasan standar penggunaan saya rasa ini cukup memenuhi, namun jika anda merasa ini masih kurang, saya pastikan informasi lebih lengkap terdapat di MySQL Manual : Union Syntax.

Kemana Lagi Setelah Ini

MySQL Manual : Union Syntax

Iklan