Voeg een kolom toe aan Categorieën die de hoofdcategorie geeft waarin elke categorie zich bevindt (waarbij de hoofdcategorieën zichzelf geven). Dus:
cat_id | main_cat_id | title
-------+-------------+---------
01 | 01 | Science
0101 | 01 | Medicine
02 | 02 | Sport
Selecteer hier uit cat_id =main_cat_id om hoofdcategorieën te vinden; sluit je weer aan bij zichzelf op left.cat_id =right.main_cat_id om de onderliggende categorieën te vinden en vervolgens op berichten op cat_id =cat_id. Groepeer op left.cat_id en project over cat_id en count(*).
Ik heb dit geprobeerd in PostgreSQL 8.4, en ik zie niet in waarom dit niet zou werken in MySQL, aangezien de query vrij eenvoudig is. Mijn tafels:
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
)
Mijn vraag (groeperen op titel in plaats van 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
UPDATE:ik had ook een kans om dit te laten werken met een stringbewerking, zoals de OP probeerde. De query (in standaard-compliant SQL zoals geaccepteerd door PostgreSQL, in plaats van MySQL's dialect) is:
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;
Wat prima werkt. Ik kan geen zinvolle vergelijking maken met betrekking tot snelheid, maar het queryplan hiervoor zag er iets eenvoudiger uit dan dat voor de tweerichtingsverbinding.