teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

sample

2018/07/19 13:07

投稿

yambejp
yambejp

スコア117906

answer CHANGED
@@ -2,4 +2,43 @@
2
2
  stationがroute情報をもっているのでestateのrouteはいらないのでは?
3
3
  もちろん山手線の渋谷と東横線の渋谷を別管理したいということなら必要ですが
4
4
 
5
- またestateが複数stattion情報をもつなら正規化する必要があります
5
+ またestateが複数stattion情報をもつなら正規化する必要があります
6
+
7
+ # sample
8
+ 冗長に処理すればこんな感じ
9
+ - 元データ
10
+ ```SQL
11
+ create table route(ro_id varchar(100) primary key,ro_name varchar(30));
12
+ insert into route values("kdfnakdnfakndfajfajdb","山手線");
13
+
14
+ create table station(st_id varchar(100) primary key,ro_id varchar(100),st_name varchar(30));
15
+ insert into station values("nfwiha4hqwkefnjg","kdfnakdnfakndfajfajdb","渋谷駅");
16
+
17
+ create table region(re_id varchar(100) primary key,re_name varchar(30));
18
+ insert into region values("faknfakndfa","港区");
19
+
20
+ create table estate(es_id varchar(100) primary key,es_name varchar(30),re_id varchar(100));
21
+ insert into estate values("fnaqi3flanv","estate","faknfakndfa");
22
+
23
+ create table access(ac_id int primary key auto_increment,es_id varchar(100),ro_id varchar(100),st_id varchar(100),during int);
24
+ insert into access(es_id,ro_id,st_id,during) values("fnaqi3flanv","aknfdfadn","fadkfakdnfadfn",3),
25
+ ("fnaqi3flanv","kdfnakdnfakndfajfajdb","nfwiha4hqwkefnjg",19);
26
+
27
+ create table room(rm_id varchar(100) primary key,es_id varchar(100),floor int,rent int,is_taken tinyint);
28
+ insert into room values("asdfghjklsdfghjkl","fnaqi3flanv",3,120000,0)
29
+
30
+
31
+ ```
32
+
33
+ - 検索
34
+ ```SQL
35
+ select es.* from estate as es
36
+ inner join room as rm on es.es_id=rm.es_id and rm.rent>=100000
37
+ and rm.es_id in (
38
+ select es_id from access as ac where ac.st_id in(
39
+ select st_id from station as st
40
+ inner join route as ro on st.ro_id=ro.ro_id and ro.ro_name='山手線'
41
+ and st.st_name in('渋谷駅','恵比寿駅')
42
+ )
43
+ )
44
+ ```