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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

671閲覧

mysql 以下のような検索ができるsql文はありますでしょうか?

sueken5

総合スコア12

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/07/19 12:14

データ構造

# route { "id": "kdfnakdnfakndfajfajdb", "name": "山手線" } # station { "id": "nfwiha4hqwkefnjg", "route_id": "kdfnakdnfakndfajfajdb", "name": "渋谷駅" } # region { "id": "faknfakndfa", "name": "港区" } # estate { "id": "fnaqi3flanv", "name": "estate", "region_id": "faknfakndfa", "accesses": [ { "route_id": "aknfdfadn", "station_id": "fadkfakdnfadfn", "during": 3 }, { "route_id": "kdfnakdnfakndfajfajdb", "station_id": "nfwiha4hqwkefnjg", "during": 19 } ] } # room { "id": "asdfghjklsdfghjkl", "estate_id": "fnaqi3flanv", "floor": 3, "rent": 120000, "is_taken": false }

質問

今上のようなデータ構造を考えていて、次のような条件で検索をしたいと思っています。

routeが山手線でstationが渋谷駅か恵比寿駅でrentが100000以上のroomをもつ

このような条件のもとestateを取得したいと思っています。

おそらくデータ構造も悪いのでご指摘いただけると幸いです。皆さんの知恵をお借りできれば幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

estateがroute情報とstation情報を持っていますが
stationがroute情報をもっているのでestateのrouteはいらないのでは?
もちろん山手線の渋谷と東横線の渋谷を別管理したいということなら必要ですが

またestateが複数stattion情報をもつなら正規化する必要があります

sample

冗長に処理すればこんな感じ

  • 元データ

SQL

1create table route(ro_id varchar(100) primary key,ro_name varchar(30)); 2insert into route values("kdfnakdnfakndfajfajdb","山手線"); 3 4create table station(st_id varchar(100) primary key,ro_id varchar(100),st_name varchar(30)); 5insert into station values("nfwiha4hqwkefnjg","kdfnakdnfakndfajfajdb","渋谷駅"); 6 7create table region(re_id varchar(100) primary key,re_name varchar(30)); 8insert into region values("faknfakndfa","港区"); 9 10create table estate(es_id varchar(100) primary key,es_name varchar(30),re_id varchar(100)); 11insert into estate values("fnaqi3flanv","estate","faknfakndfa"); 12 13create table access(ac_id int primary key auto_increment,es_id varchar(100),ro_id varchar(100),st_id varchar(100),during int); 14insert into access(es_id,ro_id,st_id,during) values("fnaqi3flanv","aknfdfadn","fadkfakdnfadfn",3), 15("fnaqi3flanv","kdfnakdnfakndfajfajdb","nfwiha4hqwkefnjg",19); 16 17create table room(rm_id varchar(100) primary key,es_id varchar(100),floor int,rent int,is_taken tinyint); 18insert into room values("asdfghjklsdfghjkl","fnaqi3flanv",3,120000,0) 19 20
  • 検索

SQL

1select es.* from estate as es 2inner join room as rm on es.es_id=rm.es_id and rm.rent>=100000 3and rm.es_id in ( 4select es_id from access as ac where ac.st_id in( 5select st_id from station as st 6inner join route as ro on st.ro_id=ro.ro_id and ro.ro_name='山手線' 7and st.st_name in('渋谷駅','恵比寿駅') 8) 9)

投稿2018/07/19 12:32

編集2018/07/19 13:07
yambejp

総合スコア114829

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

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

sueken5

2018/07/19 12:35

ご回答ありがとうございます。 山手線の渋谷と東横線の渋谷を別管理したいのでestateにroute入れています。 正規化する場合はどのようにすべきなのしょうか?知恵を貸していただけると幸いです。
sueken5

2018/07/20 05:17

ありがとうございます。非常に参考になりました。ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問