2009-08-11 12 views
13

chcę ciągnąć wyniki i policzyć ile z każdej nazwy jest wyciągnięta ale bez grupowania ...MySQL: Policz wpisy bez grupowania?

na przykład chcę to:

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

zamiast tego:

John Doe 3 
Mary Jane 2 

Czy to ma sens?

Dzięki.

+1

Co jest powodem, aby nie robić przez grupę? Możesz uzyskać dane wyjściowe, łącząc oryginalną tabelę z grupą za pomocą zapytania na tej tabeli. – pjp

+1

pjp - Nie sądzę, żeby miał problem z używaniem "GROUP BY", po prostu nie chciał zgrupować końcowego produktu. –

+0

Tak LuckyLindy ma rację. –

Odpowiedz

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

Tak samo jak moja odpowiedź - ale ja wolę moje nazewnictwo tabel :) – pjp

+1

haha, yeah ... some_table i A/B nie są zbyt opisowe;) –

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

'pola MO. * ( SELECT COUNT (*) Z mojatabela MI GDZIE mi.name = mo.name a 1 = 1, 2 i 3 = 2 = 3 ) Z mojatabela MO GDZIE mi.name = mo.nazwa i 1 = 1 i 2 = 2 i 3 = 3' narusza DRY. Jak możemy to zrobić bez konieczności powtarzania klauzuli "where"? – Pacerier

+0

@Pacerier: utwórz tabelę tymczasową i najpierw zapisz wyniki. W innych systemach możemy napisać CTE, ale MySQL ich nie obsługuje. – Quassnoi

+0

Czy jednak tabele tymczasowe są dobrym rozwiązaniem? Czy nie powinniśmy używać kursorów? – Pacerier

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

Jeśli nie chcesz korzystać z podzapytania, można również dołączyć tabelę do siebie tak: Wymagałoby to podzapytanie. Może coś takiego:

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

używa group by ale pobiera dane wyjściowe w formacie chcesz.

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