新・SQL入門編14ドリルのサムネイル
(発展)相関サブクエリ 1 MySQL編(paizaランク C 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

この問題は講座に含まれない発展的な内容を扱います。

MySQLのサブクエリには「相関サブクエリ」という種類のものがあります。

SELECT * FROM t1
WHERE column1 = ANY (SELECT column1 FROM t2
WHERE t2.column2 = t1.column2);
(MySQL公式ドキュメントより引用)

サブクエリに当たる(SELECT column1 FROM t2 WHERE t2.column2 = t1.column2)の部分にはテーブルt1に関する記述はありませんが、こういった場合は元のSELECT文からt1を見つけてきます。
また、このとき、サブクエリはt1の各行に対して実行されます。
つまり、上のクエリであれば
・サブクエリ内でcolumn2の値がt1.column2の値と一致するものを絞り込み、t2.column1をカラムとしたテーブルを作る
t1.column1の値がサブクエリで作られたテーブルに含まれれば(ANY句の処理)、そのレコードを出力する
という処理になります。

相関サブクエリは強力ですが、元のテーブルの各行に対して毎回サブクエリを実行するため、実行時間などに影響が出る場合もあります。

それでは、相関サブクエリを使ってみましょう。

注文履歴が ordered テーブルに、注文内容が ordered_menu テーブルに保存されています。
テーブルの形式は次の通りです。

ordered
#カラム名データ型内容
1ordered_id整数 (int)注文の通し番号
2datetime日時 (datetime)注文がおこなわれた日時
3bill整数 (int)注文の合計金額


ordered_menu
#カラム名データ型内容
1ordered_id整数 (int)注文の通し番号
2menu_id整数 (int)メニュー番号
3num整数 (int)メニューの注文数
4sum整数 (int)小計


注文したメニューがちょうど2種類である注文のレコードをorderedから出力してください。デフォルトコードの穴埋め部分に適切なサブクエリを記述してください。

ヒント


・あるordered_idについて「注文したメニューがちょうど2種類である」とは、「ordered_menu内にそのordered_idのレコードがちょうど2つある」ことと同じです。
・つまり、サブクエリで行う処理の中心になるのはCOUNT関数でordered_menu内のレコードを数えることになります。
・相関サブクエリの説明を参考に、サブクエリ内の条件式を考えてみましょう。

入力例1
ordered テーブル
ordered_iddatetimebill
12021-12-17 9:31200
22021-12-17 9:46250
32021-12-17 10:91050
.........
ordered_menu テーブル
ordered_idmenu_idnumsum
1141200
2211250
381350
............
出力例1
ordered_id datetime bill
8 2021-12-17 10:35:00 1050
10 2021-12-17 10:46:00 1100
12 2021-12-17 10:55:00 800
...

問題一覧へ戻る

  1. paizaトップ
  2. レベルアップ問題集
  3. 新・SQL入門編14ドリル(言語選択)
  4. 問題一覧 MySQL編
  5. (発展)相関サブクエリ 1 MySQL編
ページの先頭へ戻る