Lägg till en kolumn i kategorier som anger huvudkategorin som varje kategori är i (med huvudkategorier som ger sig själva). Så:
cat_id | main_cat_id | title
-------+-------------+---------
01 | 01 | Science
0101 | 01 | Medicine
02 | 02 | Sport
Välj från detta på cat_id =main_cat_id för att hitta huvudkategorier; gå tillbaka till sig själv på left.cat_id =right.main_cat_id för att hitta underordnade kategorier, sedan till inlägg på cat_id =cat_id. Gruppera efter left.cat_id och projektera över cat_id och count(*).
Jag försökte detta i PostgreSQL 8.4, och jag ser inte varför det inte skulle fungera i MySQL, eftersom frågan är ganska grundläggande. Mina bord:
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
)
Min fråga (gruppering efter titel snarare än 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
UPPDATERING:Jag hade också en chans att få det här att fungera med en strängoperation, som OP försökte. Frågan (i standardkompatibel SQL som accepteras av PostgreSQL, snarare än MySQL:s dialekt) är:
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;
Vilket fungerar bra. Jag kan inte erbjuda en meningsfull jämförelse vad gäller hastighet, men frågeplanen för detta såg lite enklare ut än den för tvåvägskopplingen.