श्रेणियाँ में एक कॉलम जोड़ें जो मुख्य श्रेणी देता है जिसमें प्रत्येक श्रेणी है (मुख्य श्रेणियों के साथ खुद को देते हुए)। तो:
cat_id | main_cat_id | title
-------+-------------+---------
01 | 01 | Science
0101 | 01 | Medicine
02 | 02 | Sport
मुख्य श्रेणियों को खोजने के लिए cat_id =main_cat_id पर इसमें से चुनें; चाइल्ड कैटेगरी खोजने के लिए लेफ्ट.कैट_आईडी =राइट.मेन_कैट_आईडी पर खुद से जुड़ें, फिर कैट_आईडी =कैट_आईडी पर पोस्ट पर। बाएँ.cat_id द्वारा समूहित करें और cat_id पर प्रोजेक्ट करें और गिनती करें(*)।
मैंने इसे 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
)
मेरी क्वेरी (आईडी के बजाय शीर्षक के आधार पर समूहीकृत करना):
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
अद्यतन:ओपी ने कोशिश की, जैसा कि मैंने स्ट्रिंग ऑपरेशन के साथ यह काम करने का एक शॉट भी लिया था। क्वेरी (मानक-अनुपालन SQL में, MySQL की बोली के बजाय PostgreSQL द्वारा स्वीकृत) है:
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;
जो ठीक काम करता है। मैं गति के रूप में एक सार्थक तुलना की पेशकश नहीं कर सकता, लेकिन इसके लिए क्वेरी प्लान टू-वे जॉइन की तुलना में थोड़ा आसान लग रहा था।