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
どうすればそれができますか?数が違う人をたくさん集めることができます。
ありがとう
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
句に複数の列がある場合、クエリはおそらく、それらすべての列の単一の結合インデックスの恩恵を受けるでしょう。
集計クエリを使用します。
select g.ID, g.Name, g.Phone, count(*) over ( partition by g.name ) as Count
from
Guys g;
カウントには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
Oracle DBでは次を使用できます
SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name) FROM GUYS ;
select id, name, phone,(select count(name) from users u1 where u1.name=u2.name) count from users u2