Thêm một cột vào Danh mục cung cấp danh mục chính mà mỗi danh mục có (với các danh mục chính tự tạo). Vì vậy:
cat_id | main_cat_id | title
-------+-------------+---------
01 | 01 | Science
0101 | 01 | Medicine
02 | 02 | Sport
Chọn từ mục này trên cat_id =main_cat_id để tìm các danh mục chính; tham gia trở lại chính nó trên left.cat_id =right.main_cat_id để tìm các danh mục con, sau đó vào các bài đăng trên cat_id =cat_id. Nhóm theo left.cat_id và chiếu qua cat_id và đếm (*).
Tôi đã thử điều này trong PostgreSQL 8.4 và tôi không hiểu tại sao điều này không hoạt động trong MySQL, vì truy vấn này khá cơ bản. Các bảng của tôi:
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
)
Truy vấn của tôi (nhóm theo tiêu đề thay vì 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
CẬP NHẬT:Tôi cũng đã có một lần thử nghiệm để làm cho điều này hoạt động với một hoạt động chuỗi, khi OP đã thử. Truy vấn (trong SQL tuân thủ tiêu chuẩn được chấp nhận bởi PostgreSQL, thay vì phương ngữ của MySQL) là:
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;
Mà hoạt động tốt. Tôi không thể đưa ra một so sánh có ý nghĩa về tốc độ, nhưng kế hoạch truy vấn cho điều này trông đơn giản hơn một chút so với kế hoạch kết hợp hai chiều.