LEFT JOIN COUNT Null Result
Seharian aku merasa seperti programmer goblok. Ngutak-atik query tapi nggak ketemu hasil yang diharapkan. Yah, mungkin ini balasan dari orang yang sombong merasa sudah mahir ng-query pakai Common Table Expression (CTE).
Jadi, gini lho cerita singkat dari query yang bikin gemas ini.
Kita punya dua tabel yang sederhana seperti di bawah ini:
CREATE TABLE tabel_spesies
(
  xx_idspesies character varying(4) NOT NULL,
  xx_namaspesies character varying(8) NOT NULL
);
CREATE TABLE tabel_warna
(
  hh_idspesies character varying(4) NOT NULL,
  hh_namawarna character varying(8) NOT NULL
);
Kalau diisi data kira-kira hasilnya begini:
| xx_idspesies | xx_namaspesies | 
| A01 | Anggrek | 
| A02 | Mawar | 
| hh_idspesies | hh_namawarna | 
| A01 | PUTIH | 
| A02 | MERAH | 
| A02 | MERAH | 
| A01 | PUTIH | 
| A02 | PUTIH | 
Aku inginnya ng-query LEFT JOIN dua tabel di atas dengan hasil seperti ini:
| xx_namaspesies | jumlah_merah | 
| Anggrek | 0 | 
| Mawar | 2 | 
Sederhana toh? Awalnya ini query-ku:
SELECT tb1.xx_namaspesies, COUNT(tb2.hh_idspesies) AS jumlah_merah
FROM tabel_spesies tb1 LEFT JOIN tabel_warna tb2
ON tb1.xx_idspesies = tb2.hh_idspesies
WHERE tb2.hh_namawarna = 'MERAH'
Tapi yang muncul malah seperti ini:
| xx_namaspesies | jumlah_merah | 
| Mawar | 2 | 
Lha, mana spesies Anggreknya?
Setelah mumet lama, ternyata penyelesaiannya sederhana! Hanya mengganti WHERE jadi AND seperti query di bawah ini:
SELECT tb1.xx_namaspesies, COUNT(tb2.hh_idspesies) AS jumlah_merah
FROM tabel_spesies tb1 LEFT JOIN tabel_warna tb2
ON tb1.xx_idspesies = tb2.hh_idspesies
AND tb2.hh_namawarna = 'MERAH'
Kayak orang goblok toh? Hahaha. :D
Tabel dan query di atas sekedar contoh saja. Yang aslinya lebih njelimet karena melibatkan banyak tabel, view, dan function. Maklum, buat kerjaan, hahaha. :D
Sebenernya sih bisa juga diaplikasikan dalam dunia blogging kalau ingin melihat laporan seperti di bawah ini.
| id artikel | judul artikel | jumlah seluruh komentar | komentar sudah dibalas | komentar belum dibalas | 
| 1 | Judul Artikel Pertama | 24 | 20 | 4 | 
| 2 | Judul Artikel Kedua | 61 | 60 | 1 | 
| 3 | Judul Artikel Ketiga | 10 | 0 | 10 | 
