2010-11-23 21 views
16

GUYS (ID, NAME, PHONE) adında bir tablom var ve kaç kişinin aynı ada sahip olduğunu ve aynı zamanda hepsini gösterebilmem için onları eklemem gerekiyor. . örnek: aranan çıktı olmalıdırgrupsuz sayım

ID NAME PHONE 
1 John 335 
2 Harry 444 
3 James 367 
4 John 742 
5 John 654 

ID NAME PHONE COUNT 
1 John 335 3 
2 Harry 444 1 
3 James 367 1 
4 John 742 3 
5 John 654 3 

bunu nasıl olabilir? Sadece farklı sayılarla çok sayıda erkek almayı beceririm.

sayesinde

cevap

10

Hala böyle, sadece tüm kayıtları almak için tekrar orijinal tabloya JOIN için ihtiyacım, sayım için bir GROUP BY kullanabilirsiniz:

select g.ID, g.Name, g.Phone, gc.Count 
from Guys g 
inner join (
    select Name, count(*) as Count 
    from Guys 
    group by Name 
) gc on g.Name = gc.Name 
21

MySQL kokan yana analytical functions like Oracle var, bir alt sorguya başvurmak zorunda.

bir alt-select aynı isimde adamlar sayısını saymak için kullanın GROUP BY kullanmayın:

SELECT 
    t.name, 
    t.phone, 
    (SELECT COUNT('x') FROM Guys ct 
    WHERE ct.name = t.name) as namecounter 
FROM 
    Guys t 

Sen düşünürdüm bir alt select her satır için yavaş olacağını çalışan, ancak uygun dizinlere sahipseniz, MySQL bu sorguyu optimize eder ve bunun iyi çalıştığını görürsünüz.

Bu örnekte, Guys.name'da bir dizin olmalıdır. Alt sorgunun where maddesinde birden çok sütun varsa, sorgu muhtemelen bu sütunların hepsinde tek bir birleştirilmiş dizinden yararlanabilir.

+1

kullanabilirsiniz, ama bu benim testlerde böyle değildi . Bir milyon satırlık veritabanıyla, bu sürenin yarısından azında tamamlandı. 'Name' endeksli var. – Tony

+0

Rica ederim. :) – GolezTrol

13

Kullanım toplu Sorgu:

select g.ID, g.Name, g.Phone, count(*) over (partition by g.name) as Count 
from 
Guys g; 
+3

'COUNT ... OVER (...)' MySQL sözdizimi değildir ve bu soru MySQL olarak etiketlenmiştir. –

+2

Bu MySQL için olmasa da, bu Oracle millet için daha iyi bir çözümdür. Teşekkürler Sowmia! – asgs

+0

mssql için de +1 çalışıyor! –

0

Oracle DB size ben redfilter cevabı daha yavaş gerçekleştirmek için bu sorguyu beklenen

SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name) FROM GUYS ;