web-dev-qa-db-ja.com

グループなしで数える

GUYS(ID、NAME、PHONE)という名前のテーブルが1つあり、同じ名前の人が何人いるかを追加する必要がありますが、同時にそれらすべてを表示してグループ化することはできません。例:

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

どうすればそれができますか?数が違う人をたくさん集めることができます。

ありがとう

24
east

MySQLには Oracleのような分析関数 がないため、サブクエリに頼る必要があります。

GROUP BYを使用しないで、副選択を使用して同じ名前の男の数を数えます:

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

すべての行に対してサブセレクトを実行すると遅くなると思いますが、適切なインデックスがあれば、MySQLはこのクエリを最適化し、正常に実行されることがわかります。

この例では、Guys.nameにインデックスが必要です。サブクエリのwhere句に複数の列がある場合、クエリはおそらく、それらすべての列の単一の結合インデックスの恩恵を受けるでしょう。

23
GolezTrol

集計クエリを使用します。

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

カウントにはGROUP BYを使用できますが、次のようにすべてのレコードを取得するために元のテーブルにJOINする必要があります。

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
11
RedFilter

Oracle DBでは次を使用できます

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

0
Sayantan Dey
select id, name, phone,(select count(name) from users u1 where u1.name=u2.name) count from users u2
0
redoc