Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Contando registros pertencentes a uma categoria no MySQL


Adicione uma coluna a Categorias que forneça a categoria principal em que cada categoria está (com as categorias principais dando a si mesmas). Então:
cat_id | main_cat_id | title
-------+-------------+---------
01     | 01          | Science
0101   | 01          | Medicine
02     | 02          | Sport

Selecione entre cat_id =main_cat_id para encontrar as categorias principais; junte-se novamente em left.cat_id =right.main_cat_id para encontrar as categorias filhas e, em seguida, em posts em cat_id =cat_id. Agrupe por left.cat_id e projete sobre cat_id e count(*).

Eu tentei isso no PostgreSQL 8.4 e não vejo por que isso não funcionaria no MySQL, pois a consulta é bastante básica. Minhas mesas:
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
)

Minha consulta (agrupamento por título em vez de 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

ATUALIZAÇÃO:Eu também tive a chance de fazer isso funcionar com uma operação de string, como o OP tentou. A consulta (em SQL compatível com o padrão aceito pelo PostgreSQL, em vez do dialeto do MySQL) é:
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;

O que funciona bem. Não posso oferecer uma comparação significativa quanto à velocidade, mas o plano de consulta para isso parecia um pouco mais simples do que para a junção bidirecional.