アプリ版:「スタンプのみでお礼する」機能のリリースについて

MySQLについて質問です。

以下のテーブルがあった場合に、
population、sex、Gradesを
一覧表示するにはどうしたらいいですか?

※Aテーブルのclass_idとBテーブルの
Top_scorer_idは連動しているものとする。
(Top_scorer_idに3が表示されたら、
鈴木圭さんということ)

Aテーブル:

No people_nm class_id sex
1 佐藤花子 1 女
2 山田優人 1 男
3 鈴木圭 1 男
4 高橋和子 2 女
5 山本新太郎 2 男
6 小林太郎 2 男
7 田中いちか 3 女
8 吉田大輝 3 男
9 河上のぼる 3 女

Bテーブル:

Id Top_scorer_id date
1 3 2017-03-01
2 1 2017-01-07
3 4 2017-12-05
4 1 2018-03-09
5 8 2018-09-06
6 6 2018-11-08
7 9 2018-05-02
8 3 2018-07-01
9 7 2018-02-08
10 3 2018-07-23


Cテーブル:

class_id class_nm
1 赤クラス
2 青クラス
3 黄色クラス

上記の3つのテーブルで、クラスごとに
Top_score_idの重複した数、クラスごとの
男女の人数、2018年の各クラスのTop_scorer_id
に選ばれた回数をそれぞれ一覧表示するには
どうしたらよいでしょうか。

ご教授よろしくお願いします。

質問者からの補足コメント

  • ご回答いただきありがとうございます。
    >テーブル名、カラム名について、「名は体を
    表す」ように改めてください。
    →無知ですみません。どういうことでしょうか。

    >各テーブルの結合条件を教えてください。
    →結合条件が分からなくて困っています。。。

    >鈴木圭さんのclass_idは1ですが、Top_scorer_id
    とどのように連動させるのですか?
    →これは例えば、鈴木圭さんはNoが3なので、
    BテーブルのTop_scorer_idを見ると、3と
    記載があるので、鈴木さんがトップだと分かります。
    なので、クラスごとに分ける結合条件としては、
    No(1,2,3)→class_id(1)
    No(3,4,5)→class_id(2)
    のような形を考えています。

    →population、Gradesは何ですか?
    →人数と成績です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/06/03 16:30
  • さらなるご回答いただきありがとうございます。
    「名は体を表す」の意味がよく分かりました。
    質問本文が分かりづらくすみません。
    Aテーブル、Bテーブルはテーブルの名前です。
    申し訳ありません、急いでいたので、
    テーブル名を適当につけてしまいました。
    A列のNoというのは出席番号のようなものだと
    考えております。つまり、Noが1ならイコール
    佐藤花子さんだという形です。
    なぜか、列をしっかり分けて書いたにも関わらず
    列が分かれていなくて、カラムがすごく分かりにく
    なってしまっております。申し訳ありません。
    左から記載しておりますので、順に
    カラム名と一致する値が内容になります。

    本当にありがとうございます。
    後ほどご回答いただけるということで、
    よろしくお願いいたします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/06/03 17:54

A 回答 (3件)

取得してみました。


集計の意図が異なる場合は、正しい内容を補足してください。

-- クラスごとにTop_score_idの重複した数
select
c.class_nm
,e.top_scorer_people_id
,p.people_nm
,count(e.exam_date) as トップスコア数
from
exam e, people p, class c
where
e.top_scorer_people_id = p.people_id
and p.class_id = c.class_id
group by
c.class_nm
,e.top_scorer_people_id
,p.people_nm
;

-- クラスごとの男女の人数
select
c.class_nm
,p.sex
,count(p.people_id) as 人数
from
people p, class c
where
p.class_id = c.class_id
group by
c.class_nm
,p.sex
;

-- 2018年の各クラスのTop_scorer_idに選ばれた回数
select
c.class_nm
,count(e.exam_date) as トップスコア数
from
exam e, people p, class c
where
e.exam_date between '2018-01-01' and '2018-12-31'
and e.top_scorer_people_id = p.people_id
and p.class_id = c.class_id
group by
c.class_nm
;
    • good
    • 0

補足ありがとうございます。



「名は体を表す」
・テーブル名がAだのBだのでは、何のテーブルなんだかさっぱりわかりません。
・カラム名も同様です。
Aテーブルの「No」列。何の番号なの?となります。
そのような部分を整理しないと、DBを効率よく操ることはできません。

「結合条件」
・データ設計の基本的な内容です。
 それがわからないことには、各テーブルからどのようにデータを取得するかなんて決められません。


補足いただいた内容から、テーブル名、カラム名を整理してみました。
具体的な抽出方法は、後で考えて回答します。

peopleテーブル:

people_id people_nm class_id sex
1 佐藤花子 1 女
2 山田優人 1 男
3 鈴木圭 1 男
4 高橋和子 2 女
5 山本新太郎 2 男
6 小林太郎 2 男
7 田中いちか 3 女
8 吉田大輝 3 男
9 河上のぼる 3 女

examテーブル:

exam_id top_scorer_people_id exam_date
1 3 2017-03-01
2 1 2017-01-07
3 4 2017-12-05
4 1 2018-03-09
5 8 2018-09-06
6 6 2018-11-08
7 9 2018-05-02
8 3 2018-07-01
9 7 2018-02-08
10 3 2018-07-23

classテーブル:

class_id class_nm
1 赤クラス
2 青クラス
3 黄色クラス


結合条件

peopleテーブル.people_id = examテーブル.top_scorer_people_id
peopleテーブル.class_id = classテーブル.class_id
この回答への補足あり
    • good
    • 0

仕様を整理してください。


・テーブル名、カラム名について、「名は体を表す」ように改めてください。
・各テーブルの結合条件を教えてください。
・鈴木圭さんのclass_idは1ですが、Top_scorer_idとどのように連動させるのですか?
・population、Gradesは、何ですか?
この回答への補足あり
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!