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 |