90893


下記のようなusersテーブルから同じnameの人の数を一緒に取得するにはどのようなSQLを実行すればよいのでしょうか？データベースはMySQL5.6です。

id | name  
---|---  
1 | "Yamada"  
2 | "Yamada"  
3 | "Suzuki"  
4 | "Honda"  
  
SQLの実行結果として、このようなものをイメージしています。

id | name | count  
---|---|---  
1 | "Yamada" | 2  
2 | "Yamada" | 2  
3 | "Suzuki" | 1  
4 | "Honda" | 1


CC BY-SA 4.0
2022-09-02T01:31:16.343
90892
2022-09-02T02:18:14.520
2022-09-02T02:16:05.973
19297
19297
question
mysql sql
SQLで同じ値を持つカラムの数も一緒に取得する方法を教えてください
  
  
これは **編集前の内容にあわせた回答** です。  
第三者にも役立つ内容と判断して、そのまま投稿します。

* * *

行の増減や値の更新、時間の変動など、外部的な要因に連動して変化するデータをテーブルに格納することは、コメントにあるように良い設計ではありません。

例えばご質問の`name`カラムや年齢を示す`age`カラムなどが上記の例に当たります。  
「テーブル更新するたびにupdateすればいいじゃないか」「毎晩バッチ処理で年齢計算できるから問題ない」と思う方もいるかもしれませんが、今後の開発で増えたプログラムでupdateを忘れたり、バッチ処理がエラーで動かなくなったりした時に破綻します。

毎回`count`を集計するSQLをコピペする状況を解決するために、[`VIEW`](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%A5%E3%83%BC_\(%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9\))が用意されています。  
VIEWを定義することで、集計関数を使用したSQL実行結果をまるでテーブルのように扱えます。  
VIEWの使用を検討してください。

**Schema (MySQL v5.7)**

[code]

    create table user (
      id int,
      name varchar(30)
      );
    
    create index idx_user_name on user(name);
    
    insert into user values(1, 'Yamada');
    insert into user values(2, 'Yamada');
    insert into user values(3, 'Suzuki');
    insert into user values(4, 'Honda');
    
    # 下記のSQLのselect以下が「どのようなSQLを実行すればよいのでしょうか？」の回答に該当します
    create view user_count as
    select u.*, c.cnt
    from   user u,
           (select name, count(1) cnt from user group by name) c
    where  u.name = c.name;
    
[/code]

* * *

**Query #1**

[code]

    select * from user_count;
    
[/code]

id | name | cnt  
---|---|---  
1 | Yamada | 2  
2 | Yamada | 2  
3 | Suzuki | 1  
4 | Honda | 1  
  
* * *

[View on DB Fiddle](https://www.db-fiddle.com/f/ignFAi32tZXabbYcKZQfKD/0)


CC BY-SA 4.0
2022-09-02T02:18:14.520
90893
2022-09-02T02:18:14.520
9820
90892
answer