2009-08-11 8 views
13

Je veux tirer des résultats et compter le nombre de chaque nom est tiré mais sans groupant ...MySQL: Compter les entrées sans regrouper?

par exemple, je veux ceci:

John Doe 3 
John Doe 3 
John Doe 3 
Mary Jane 2 
Mary Jane 2 

au lieu de ceci:

John Doe 3 
Mary Jane 2 

Cela a-t-il du sens?

Merci.

+1

Quelle est la raison de ne pas faire un groupe par? Vous pouvez obtenir la sortie souhaitée en joignant votre table d'origine avec un groupe par requête sur cette table. – pjp

+1

pjp - Je ne pense pas qu'il ait eu un problème avec l'utilisation d'un 'GROUP BY', il ne voulait pas que la sortie finale soit groupée. –

+0

Oui LuckyLindy est correct. –

Répondre

10
SELECT b.name, a.the_count 
FROM 
    some_table b, 
    (SELECT name, COUNT(*) AS the_count 
    FROM some_table 
    GROUP BY name) AS a 
WHERE b.name = a.name 
+0

Même que ma réponse - mais je préfère ma table nommant :) – pjp

+1

haha, ouais ... some_table et A/B ne sont pas très descriptifs;) –

2
SELECT mo.*, 
     (
     SELECT COUNT(*) 
     FROM mytable mi 
     WHERE mi.name = mo.name 
     ) 
FROM mytable mo 
+0

'SELECT mo. *, ( SELECT COUNT (*) à partir de matable mi OÙ mi.name = mo.name et 1 = 1 et 2 = 2 et 3 = 3 ) à partir de matable mo OÙ mi.name = mo.name et 1 = 1 et 2 = 2 et 3 = 3' viole DRY. Comment pouvons-nous faire cela sans avoir à répéter la clause 'where'? – Pacerier

+0

@Pacerier: crée une table temporaire et y écrit les résultats en premier. Dans d'autres systèmes, nous pourrions écrire un CTE, mais MySQL ne les supporte pas. – Quassnoi

+0

Les tables temporaires sont-elles une bonne solution? Ne devrions-nous pas utiliser des curseurs? – Pacerier

0
SELECT `name`, 
    (
     SELECT COUNT(*) 
     FROM `table` AS `alt` 
     WHERE `alt`.`name` = `table`.`name` 
    ) AS `num` 
FROM `table` 
2

Si vous ne souhaitez pas utiliser une sous-requête, vous pouvez également joindre la table pour lui-même comme si: Cela nécessiterait une sous-requête. Peut-être quelque chose comme ceci:

SELECT t1.name, COUNT(t2.name) 
FROM my_table AS t1 
INNER JOIN my_table AS t2 ON (t1.primary_key_field = t2.primary_key_field) 
WHERE some_conditions 
GROUP BY t1.name 
2

Il utilise group by mais obtient la sortie dans le format que vous voulez.

SELECT Name, NG.NameCount 
FROM Names 
INNER JOIN 
    (SELECT Name, Count(1) As NameCount 
    FROM Names 
    GROUP BY Name) NG 
ON Names.Name = NG.Name 
Questions connexes