Tambahkan kolom ke Kategori yang memberikan kategori utama di mana setiap kategori berada (dengan kategori utama memberikan dirinya sendiri). Jadi:
cat_id | main_cat_id | title
-------+-------------+---------
01 | 01 | Science
0101 | 01 | Medicine
02 | 02 | Sport
Pilih dari ini di cat_id =main_cat_id untuk menemukan kategori utama; gabungkan kembali ke dirinya sendiri di left.cat_id =right.main_cat_id untuk menemukan kategori anak, lalu ke posting di cat_id =cat_id. Kelompokkan menurut left.cat_id dan proyeksikan melalui cat_id dan count(*).
Saya mencoba ini di PostgreSQL 8.4, dan saya tidak mengerti mengapa ini tidak berhasil di MySQL, karena kuerinya cukup mendasar. Meja saya:
create table categories(
cat_id varchar(40) primary key,
main_cat_id varchar(40) not null references categories,
title varchar(40) not null
)
create table posts (
post_id integer primary key,
cat_id varchar(40) not null references categories,
title varchar(40) not null
)
Permintaan saya (pengelompokan berdasarkan judul dan bukan ID):
select m.title, count(*)
from categories m, categories c, posts p
where m.cat_id = c.main_cat_id
and c.cat_id = p.cat_id
group by m.title
PEMBARUAN:Saya juga mencoba membuat ini berfungsi dengan operasi string, ketika OP mencoba. Kueri (dalam SQL yang sesuai standar seperti yang diterima oleh PostgreSQL, bukan dialek MySQL) adalah:
select m.title, count(*)
from categories m, posts p
where m.cat_id = substring(p.cat_id from 1 for 2)
group by m.title;
Yang bekerja dengan baik. Saya tidak dapat memberikan perbandingan yang berarti mengenai kecepatan, tetapi rencana kueri untuk ini memang terlihat sedikit lebih sederhana daripada untuk penggabungan dua arah.