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

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

解決済

4回答

1751閲覧

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グッド

1クリップ

投稿2018/03/24 02:29

質問内容

 皆さま、こんにちわ。私は今以下の様な条件で検索できるSQL分はないかと探しています。

table: estate { id: 1, name: サンプル建設 }, { id: 2, name: サンプル不動産 } table: tags { id: 1, tag: 神奈川県, estate_id: 1 }, { id: 2, tag:ペット可, estate_id: 1 }, { id: 3, tag: 東京都, estate_id: 2 }

この様なテーブル構造で「神奈川県タグとペット可タグをもつ不動産」を検索できるSQL文はないでしょうか?皆様のお知恵をお借りできれば幸いです。

また、質問者自身RDBに詳しくないのでテーブル構造がそもそもまずいということもあると思います。ですのでもっと良いテーブル構造があればご教授いただければ幸いです。よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

不動産屋さんには複数のタグが付くかもしれないし、同じタグが複数の不動産屋さんにつくかもしれませんよね?
そんな場合は中間テーブルを使って、多対多結合を表現するのがベストプラクティスです。

多対多結合ついて詳しくはググってください。

以下の3つのテーブルがあったとして

estatesテーブル
id(主キー)
name(ユニーク)

tagsテーブル
id (主キー)
name(ユニーク)

estates_tagsテーブル
tag_id(主キー)
estate_id(主キー)

SQLはこんな感じで

SQL

1SELECT estates.name 2FROM estates 3INNER JOIN estates_tags 4 ON estates_tags.estate_id = estates.id 5INNER JOIN tags 6 ON estates_tags.tag_id = tags.id 7WHERE tags.name = "神奈川県" OR tags.name = "ペット可" 8GROUP BY estates.name 9HAVING COUNT(0) = 2

テーブルも追記します。

SQL

1CREATE TABLE estates(id int PRIMARY KEY, name varchar(255) UNIQUE); 2 3CREATE TABLE tags(id int PRIMARY KEY, name varchar(255) UNIQUE); 4 5CREATE TABLE estates_tags( 6 estate_id int NOT NULL, 7 tag_id int NOT NULL, 8 PRIMARY KEY(estate_id, tag_id), 9 FOREIGN KEY(estate_id) REFERENCES estates(id), 10 FOREIGN KEY(tag_id) REFERENCES tags(id)); 11 12INSERT INTO estates (id, name) 13 VALUES (1, 'サンプル建設'), (2, 'サンプル不動産'); 14 15INSERT INTO tags (id, name) 16 VALUES (1, '神奈川県'), (2, 'ペット可'), (3, '東京都'); 17 18INSERT INTO estates_tags(estate_id, tag_id) 19VALUES (1, 1), (1, 2), (2, 3), (2, 2)

投稿2018/03/24 03:51

編集2018/03/24 07:17
hihijiji

総合スコア4150

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

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

sueken5

2018/03/25 00:41

非常にためになる回答ありがとうございます。今回ベストアンサーとさせていただきました。今後ともよろしくお願いします。
guest

0

一応、でけました。

###お膳立て

SQL

1create database test CHARACTER SET utf8mb4; 2 3use test; 4 5create table estate ( 6id int PRIMARY KEY, 7name varchar(255) 8) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 9 10create table tags( 11id int PRIMARY KEY, 12tag varchar(255), 13estate_id int 14) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 15 16INSERT INTO test.estate (id, name) VALUES (1, 'サンプル建設'), (2, 'サンプル不動産'); 17INSERT INTO test.tags (id, tag, estate_id) VALUES (1, '神奈川県', 1), (2, 'ペット可', 1), (3, '東京都', 2);

###SELECTクエリー

SQL

1SELECT e.id, e.name, t.ts 2FROM estate AS e 3LEFT JOIN (SELECT estate_id, group_concat(tag) AS ts FROM tags GROUP BY estate_id ORDER BY id ASC) AS t 4ON e.id = t.estate_id 5WHERE t.ts LIKE '%神奈川%' AND t.ts LIKE '%ペット可%';

###SELCT結果
SELECT結果

投稿2018/03/24 06:23

編集2018/03/24 06:26
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sueken5

2018/03/25 00:39

実際の例まで出してくれて本当にありがとうございます。しかし今回は多対多結合を利用するという一般的に採用されている例を提示してくれている方がいらっしゃったのでそちらの方をベストアンサーとさせていただきます。何卒ご了承ください。
guest

0

「神奈川県タグとペット可タグ」これは、「所在地」と「ペット可否」という独立した情報なので、「タグ」という一括りの構造にはしない方が良いです。

独立していればAND条件も容易になります。

当然登録する際の画面を考えると、単にタグの欄に列挙されるだけだと扱いづらいですし。

投稿2018/03/24 04:58

sazi

総合スコア25173

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

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

sueken5

2018/03/25 00:40

回答ありがとうございました。とてもためになりました。
guest

0

これでよかったような…。

SQL

1SELECT e.name 2FROM estate AS e 3LEFT JOIN tags AS t 4 ON e.id = t.estate_id 5WHERE t.tag = '神奈川県' OR t.tag = 'ペット可' 6GROUP BY e.id 7ORDER BY e.id ASC;

投稿2018/03/24 02:41

編集2018/03/24 03:05
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/03/24 02:44

神奈川県タグとペット可タグをもつ ← これは、神奈川県タグまたはペット可タグをもつ かな?
sueken5

2018/03/24 03:17 編集

コメントありがとうございます。 両方がいいです。その場合はORの部分をANDにしたらいいということでしょうか?
退会済みユーザー

退会済みユーザー

2018/03/24 03:33

そうすると、結構変わってきちゃうと思います。時間があったらあとでレスします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問