1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【電脳少女プログラミング2088 ─壊レタ君を再構築─】SQL問題をやってみた。

Posted at

paizaの新作プログラミングゲーム【電脳少女プログラミング2088 ─壊レタ君を再構築─】SQL問題をやってみました。


データセンター

person.idperson.namepersonテーブルからすべて取得するので

SELECT id, name FROM person;

となります。


ここからは少しずつSQLを書いていきますので、最終形以外は

  • シンタックスハイライト無し
  • 文末のセミコロン無し

とさせていただきます。


二人が通った教室

memory.idmemory.talkmemoryテーブルから取得するので、まずは

SELECT id, talk FROM memory

idの小さい順に10件取得するので、ORDER BY id LIMIT 10を付けて

SELECT id, talk FROM memory ORDER BY id LIMIT 10;

となります。


会員制ジム

memory.idmemory.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_at2085-08-012087-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;

となります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?