sql >> Databáze >  >> RDS >> Mysql

Počítání záznamů patřících do kategorie v MySQL

Přidejte do kategorií sloupec, který uvádí hlavní kategorii, ve které se každá kategorie nachází (s hlavními kategoriemi, které uvádějí samy sebe). Takže:

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

Vyberte si z tohoto na cat_id =main_cat_id a vyhledejte hlavní kategorie; připojte se zpět k sobě na left.cat_id =right.main_cat_id, abyste našli podřízené kategorie, poté na příspěvky na cat_id =cat_id. Seskupte podle left.cat_id a projekt přes cat_id a count(*).

Zkoušel jsem to v PostgreSQL 8.4 a nevidím důvod, proč by to nefungovalo v MySQL, protože dotaz je docela základní. Moje tabulky:

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
)

Můj dotaz (seskupení podle názvu spíše než 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

AKTUALIZACE:Také jsem měl šanci, aby to fungovalo pomocí operace řetězce, jak to zkusil OP. Dotaz (v SQL vyhovujícím standardu, jak jej přijímá PostgreSQL, spíše než dialekt MySQL) je:

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;

Což funguje dobře. Nemohu nabídnout smysluplné srovnání, pokud jde o rychlost, ale plán dotazů pro toto vypadal o něco jednodušší než pro dvoucestné spojení.



  1. GROUP BY - neseskupujte NULL

  2. Databázové služby na platformě AWS a Oracle Cloud

  3. Dotaz MySQL není vložen, když proměnná PHP obsahuje jednoduché uvozovky

  4. Proč dostanu Postup očekává parametr '@statement' typu 'ntext/nchar/nvarchar'. když se pokusím použít sp_executesql?