質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

1173閲覧

別の表から情報を参照し、条件を満たす個数を合計する方法

asakusahammu

総合スコア8

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/07/21 12:33

こんにちは。SQL初心者です。

1つの表から得られた情報を元に、
別の表における条件を満たす個数を合計する処理がわかりません。

まず、gender, medal_choiceの2つの表を作成します。

lang

1CREATE TABLE `gender` ( 2 `user_id` int(11) NOT NULL, 3 `gender` int(11) NOT NULL 4) ENGINE=InnoDB DEFAULT CHARSET=utf8; 5 6INSERT INTO `gender` (`user_id`, `gender`) VALUES 7(100, 0), 8(101, 1), 9(102, 1), 10(103, 0), 11(104, 1);

テーブル名前:gender
(ユーザーごとの性別。0が男性、1が女性)

+---------+--------+ | user_id | gender | +---------+--------+ | 100 | 0 | | 101 | 1 | | 102 | 1 | | 103 | 0 | | 104 | 1 | +---------+--------+

lang

1CREATE TABLE `medal_choice` ( 2 `user_id` int(11) NOT NULL, 3 `medal` text NOT NULL, 4 `amount` int(11) NOT NULL 5) ENGINE=InnoDB DEFAULT CHARSET=utf8; 6 7INSERT INTO `medal_choice` (`user_id`, `medal`, `amount`) VALUES 8(100, 'gold', 1), 9(100, 'silver', 2), 10(100, 'copper', 3), 11(101, 'gold', 2), 12(101, 'silver', 3), 13(101, 'copper', 1), 14(102, 'silver', 4), 15(102, 'copper', 2), 16(103, 'gold', 1), 17(104, 'gold', 6), 18(104, 'copper', 2); 19

テーブル名:medal_choice
(各ユーザーが、gold, silver, copper3種の各メダルを何枚選んだか)

+---------+--------+--------+ | user_id | medal | amount | +---------+--------+--------+ | 100 | gold | 1 | | 100 | silver | 2 | | 100 | copper | 3 | | 101 | gold | 2 | | 101 | silver | 3 | | 101 | copper | 1 | | 102 | silver | 4 | | 102 | copper | 2 | | 103 | gold | 1 | | 104 | gold | 6 | | 104 | copper | 2 | +---------+--------+--------+

この2つの表から、

 女性ユーザーのみについて、
各ユーザー別のgoldとsilverの合計数(copperは含まない)
を、totalとして出力する

この処理を実行したいのですが、構文の組み立て方がわかりません。

<求める結果>
例えば、user_idが101のresultは、gold+silver = 2+3=5となる

(1)テーブルgenderから、user_idが1(女性)のみを抽出
(2) (1)の情報を元に、goldとsilverの合計を出力

この2処理を同時にする必要があると考えております。

皆様のお知恵を拝借したいです。宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

そんなに難しく考えなくても良さそうですけど、どういった点が思い付かないでしょうか。

SQL

1select t1.user_id, sum(amount) as total 2from gender t1 left join medal_choice t2 3 on t1.user_id=t2.user_id 4where t1.gender=1 5 and t2.medal in ('gold', 'silver') 6group by t1.user_id

投稿2018/07/21 19:11

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/07/22 01:01

解説は、hichonさんが書かれている内容です。
asakusahammu

2018/07/22 10:32 編集

ありがとうございます。すみません、t1,t2とは、結合テーブルの名前でしょうか? (SQLの基礎を丁寧になぞったら、ある程度は理解できるようになりました。急がば回れですね…)
sazi

2018/07/22 10:44

t1やt2はエイリアス(別名)です。 修飾の際、省略した名称などに用います。
asakusahammu

2018/07/22 12:03

ありがとうございます。
guest

0

(1)テーブルgenderから、user_idが1(女性)のみを抽出
(2) (1)の情報を元に、goldとsilverの合計を出力

手続き型言語の考え方は忘れましょう。
SQLは集合(=テーブル)を操作する言語です。

(1)テーブルgenderとmedal_choiceを結合して新しいテーブルを作成
(2)新しいテーブルから(genderが1)かつ(medalがgoldまたはsilver)のレコードを取得
(3)取得したレコードのamountをuser_idごとに集計

投稿2018/07/21 13:14

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/07/22 01:03

あまり内容見ないで回答しちゃいました。すみません。 「テーブル作成する」ってところで、ちょっと違うと早とちりしてしまいました。
asakusahammu

2018/07/22 10:25

>手続き型言語の考え方は忘れましょう。 SQLは集合(=テーブル)を操作する言語です。 こうした基本的な考え方がよく解らず、javaのように上から順番に処理する言語だと思っていました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問