sql >> Database teknologi >  >> RDS >> Mysql

Optælling af poster, der tilhører en kategori i MySQL

Tilføj en kolonne til Kategorier, som angiver hovedkategorien, som hver kategori er i (hvor hovedkategorierne giver sig selv). Så:

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

Vælg fra dette på cat_id =main_cat_id for at finde hovedkategorier; kom tilbage til sig selv på left.cat_id =right.main_cat_id for at finde underordnede kategorier, og derefter på indlæg på cat_id =cat_id. Gruppér efter left.cat_id og projekter over cat_id og count(*).

Jeg prøvede dette i PostgreSQL 8.4, og jeg kan ikke se, hvorfor dette ikke ville fungere i MySQL, da forespørgslen er ret grundlæggende. Mine borde:

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
)

Min forespørgsel (gruppering efter titel i stedet for 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

OPDATERING:Jeg havde også en chance for at få dette til at fungere med en strengoperation, som OP forsøgte. Forespørgslen (i standard-kompatibel SQL som accepteret af PostgreSQL, snarere end MySQL's dialekt) er:

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;

Hvilket fungerer fint. Jeg kan ikke tilbyde en meningsfuld sammenligning med hensyn til hastighed, men forespørgselsplanen for dette så en smule enklere ud end den for to-vejs joinforbindelsen.



  1. Synkronisering af data mellem to forskellige databaser

  2. Sådan skriver du en effektiv hittæller til websteder

  3. MySQL-fejl:Kan ikke tilføje en fremmednøglebegrænsning?

  4. 2 måder at få de tilgængelige tegnsæt i MariaDB