2017-10-20 26 views
1

Je cherche à compter le nombre de lignes correspondantes pour chaque identifiant dans le tableau ci-dessous. Bien qu'une option soit de créer une autre table qui garde la trace du nombre de chaque catégorie, je préférerais résoudre ceci sans créer une deuxième table (idéalement sans table temporaire aussi).Sélectionnez le nombre de lignes correspondantes d'une colonne particulière dans MySQL

Mon tableau:

+---------+----------------+ 
| id  | category  | 
+---------+----------------+ 
| 3611383 | AAAAAAAAAAAAAA | 
| 3611382 | AAAAAAAAAAAAAA | 
| 3611381 | AAAAAAAAAAAAAA | 
| 3611378 | AAAAAAAAAAAAAA | 
| 3611377 | AAAAAAAAAAAAAA | 
| 3611376 | AAAAAAAAAAAAAA | 
| 3611374 | AAAAAAAAAAAAAA | 
| 3611373 | AAAAAAAAAAAAAA | 
| 3611372 | BBBBBBBBBBBBBB | 
| 3611371 | BBBBBBBBBBBBBB | 
| 3611370 | BBBBBBBBBBBBBB | 
| 3611369 | BBBBBBBBBBBBBB | 
| 3611366 | CCCCCCCCCCCCCC | 
| 3611365 | CCCCCCCCCCCCCC | 
| 3611364 | CCCCCCCCCCCCCC | 
+---------+----------------+ 

sortie souhaitée:

+---------+----------------+---------+ 
| id  | category  | count | 
+---------+----------------+---------+ 
| 3611383 | AAAAAAAAAAAAAA | 8  | 
| 3611382 | AAAAAAAAAAAAAA | 8  | 
| 3611381 | AAAAAAAAAAAAAA | 8  | 
| 3611378 | AAAAAAAAAAAAAA | 8  | 
| 3611377 | AAAAAAAAAAAAAA | 8  | 
| 3611376 | AAAAAAAAAAAAAA | 8  | 
| 3611374 | AAAAAAAAAAAAAA | 8  | 
| 3611373 | AAAAAAAAAAAAAA | 8  | 
| 3611372 | BBBBBBBBBBBBBB | 4  | 
| 3611371 | BBBBBBBBBBBBBB | 4  | 
| 3611370 | BBBBBBBBBBBBBB | 4  | 
| 3611369 | BBBBBBBBBBBBBB | 4  | 
| 3611366 | CCCCCCCCCCCCCC | 3  | 
| 3611365 | CCCCCCCCCCCCCC | 3  | 
| 3611364 | CCCCCCCCCCCCCC | 3  | 
+---------+----------------+---------+ 

Le plus proche que j'ai obtenu est

SELECT id, category, count(category) AS c FROM mytable ORDER BY id DESC; 

Mais ce produit volonté seule ligne:

+---------+----------------+---------+ 
| id  | category  | c  | 
+---------+----------------+---------+ 
| 3611383 | AAAAAAAAAAAAAA | 8  | 
+---------+----------------+---------+ 

Répondre

1

Une méthode est une sous-requête corrélative:

select t.*, 
     (select count(*) from mytable t2 where t2.category = t.category) as c 
from mytable t; 

Une alternative est de faire un group by et join. Un avantage de la sous-requête corrélée est qu'elle peut facilement tirer parti d'un index sur mytable(category).

+0

Merci, c'est exactement ce que je cherchais! –