カテゴリに列を追加して、各カテゴリが含まれるメインカテゴリを示します(メインカテゴリはそれ自体を示します)。だから:
cat_id | main_cat_id | title
-------+-------------+---------
01 | 01 | Science
0101 | 01 | Medicine
02 | 02 | Sport
cat_id =main_cat_idでこれを選択して、メインカテゴリを検索します。 left.cat_id =right.main_cat_idで自分自身に参加して子カテゴリを見つけ、次にcat_id=cat_idの投稿に参加します。 left.cat_idでグループ化し、cat_idとcount(*)を超えてプロジェクトします。
PostgreSQL 8.4でこれを試しましたが、クエリが非常に基本的であるため、MySQLでこれが機能しない理由がわかりません。私のテーブル:
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
)
私のクエリ(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
更新:OPが試したように、文字列操作でこれを機能させることも試みました。クエリ(MySQLの方言ではなくPostgreSQLで受け入れられる標準準拠のSQL)は次のとおりです。
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;
これは問題なく動作します。速度に関して意味のある比較を提供することはできませんが、このクエリプランは、双方向結合のクエリプランよりも少し単純に見えました。