paizaの新作プログラミングゲーム【電脳少女プログラミング2088 ─壊レタ君を再構築─】SQL問題をやってみました。
データセンター
person.id
とperson.name
をperson
テーブルからすべて取得するので
SELECT id, name FROM person;
となります。
ここからは少しずつSQLを書いていきますので、最終形以外は
- シンタックスハイライト無し
- 文末のセミコロン無し
とさせていただきます。
二人が通った教室
memory.id
とmemory.talk
をmemory
テーブルから取得するので、まずは
SELECT id, talk FROM memory
id
の小さい順に10件取得するので、ORDER BY id LIMIT 10
を付けて
SELECT id, talk FROM memory ORDER BY id LIMIT 10;
となります。
会員制ジム
memory.id
とmemory.talk
を取得するので、まずは
SELECT id, talk FROM memory
条件が
-
memory.importance
が3以上 -
category.name
が「悲しみ」
とあるので、一旦
SELECT
id, talk
FROM
memory
WHERE
importance >= 3
AND category.name = '悲しみ'
となりますが、memory
テーブルとcategory
テーブルを(内部)結合させなければなりません。
memory
テーブルとcategory
テーブルをカテゴリIDで結合させて
SELECT
memory.id, memory.talk
FROM
memory
INNER JOIN category ON memory.category_id = category.id
WHERE
memory.importance >= 3
AND category.name = '悲しみ';
となります。
打ち捨てられた図書館
memory.id
, memory.talk
, battle.result
を取得したいのですが、memory
テーブルとbattle
テーブルを直接関係づける属性はありません。
そこで、中間テーブルに当たるlog
テーブルを使って、memory
テーブルとbattle
テーブルのレコードを関連付けます。
SELECT
memory.id, memory.talk, battle.result
FROM
log
INNER JOIN memory ON log.memory_id = memory.id
INNER JOIN battle ON log.battle_id = battle.id
更に、log.created_at
が2085-08-01
〜2087-10-20
の期間とありますので、BETWEEN
を使って
SELECT
memory.id,
memory.talk,
battle.result
FROM
log
INNER JOIN memory ON log.memory_id = memory.id
INNER JOIN battle ON log.battle_id = battle.id
WHERE
log.created_at BETWEEN '2085-08-01' AND '2087-10-20';
となります。
巨大コーポの最上階
memory.id
, memory.talk
, person.name
, battle.created_at
を取得したいので、まずは
SELECT
memory.id,
memory.talk,
person.name,
battle.created_at
memory
, person
, battle
テーブルの各レコードを関連付けるため、log
テーブルも使って4つのテーブルを
- 記憶のID(
memory.id
,log.memory_id
) - 人物のID(
person.id
,log.person_id
,battle.person_id
)
で(レイミの指摘を受けないような順番で)結合させます。
SELECT
memory.id,
memory.talk,
person.name,
battle.created_at
FROM
memory
INNER JOIN log ON memory.id = log.memory_id
INNER JOIN person ON log.person_id = person.id
INNER JOIN battle ON person.id = battle.person_id
更に、「重要度が5の人物のperson.deleted_at
と同じbattle
の battle.created_at
から」とありますので
SELECT
memory.id,
memory.talk,
person.name,
battle.created_at
FROM
memory
INNER JOIN log ON memory.id = log.memory_id
INNER JOIN person ON log.person_id = person.id
INNER JOIN battle ON person.id = battle.person_id
WHERE
person.importance = 5
AND battle.created_at = person.deleted_at;
となります。