sql >> Database >  >> RDS >> Mysql

Records tellen die behoren tot een categorie in MySQL

Voeg een kolom toe aan Categorieën die de hoofdcategorie geeft waarin elke categorie zich bevindt (waarbij de hoofdcategorieën zichzelf geven). Dus:

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

Selecteer hier uit cat_id =main_cat_id om hoofdcategorieën te vinden; sluit je weer aan bij zichzelf op left.cat_id =right.main_cat_id om de onderliggende categorieën te vinden en vervolgens op berichten op cat_id =cat_id. Groepeer op left.cat_id en project over cat_id en count(*).

Ik heb dit geprobeerd in PostgreSQL 8.4, en ik zie niet in waarom dit niet zou werken in MySQL, aangezien de query vrij eenvoudig is. Mijn tafels:

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
)

Mijn vraag (groeperen op titel in plaats van 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

UPDATE:ik had ook een kans om dit te laten werken met een stringbewerking, zoals de OP probeerde. De query (in standaard-compliant SQL zoals geaccepteerd door PostgreSQL, in plaats van MySQL's dialect) is:

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;

Wat prima werkt. Ik kan geen zinvolle vergelijking maken met betrekking tot snelheid, maar het queryplan hiervoor zag er iets eenvoudiger uit dan dat voor de tweerichtingsverbinding.



  1. Splits varchar in afzonderlijke kolommen in Oracle

  2. het nieuwe rij-ID ophalen van pySpark SQL schrijven naar externe mysql db (JDBC)

  3. CodeIgniter schakelen tussen stuurprogramma van mysql --> mysqli

  4. een MYSQL-script om de kolomnamen naar kleine letters te converteren