Mysql
 sql >> Base de données >  >> RDS >> Mysql

Compter les enregistrements appartenant à une catégorie dans MySQL

Ajoutez une colonne à Catégories qui indique la catégorie principale dans laquelle se trouve chaque catégorie (les catégories principales se donnant elles-mêmes). Donc :

cat_id | main_cat_id | title
-------+-------------+---------
01     | 01          | Science
0101   | 01          | Medicine
02     | 02          | Sport

Sélectionnez parmi ceux-ci cat_id =main_cat_id pour trouver les catégories principales ; rejoindre sur lui-même sur left.cat_id =right.main_cat_id pour trouver les catégories enfants, puis sur les publications sur cat_id =cat_id. Grouper par left.cat_id et projeter sur cat_id et count(*).

J'ai essayé cela dans PostgreSQL 8.4, et je ne vois pas pourquoi cela ne fonctionnerait pas dans MySQL, car la requête est assez basique. Mes tableaux :

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
)

Ma requête (regroupement par titre plutôt que par 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

MISE À JOUR :J'ai également tenté de faire fonctionner cela avec une opération de chaîne, comme l'OP l'a essayé. La requête (en SQL conforme au standard tel qu'accepté par PostgreSQL, plutôt que le dialecte de MySQL) est :

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;

Qui fonctionne bien. Je ne peux pas offrir de comparaison significative quant à la vitesse, mais le plan de requête pour cela semblait un peu plus simple que celui de la jointure bidirectionnelle.