質問: 質問内容 ----- 皆さま、こんにちわ。私は今以下の様な条件で検索できる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に詳しくないのでテーブル構造がそもそもまずいということもあると思います。ですのでもっと良いテーブル構造があればご教授いただければ幸いです。よろしくお願いします。
回答: 不動産屋さんには複数のタグが付くかもしれないし、同じタグが複数の不動産屋さんにつくかもしれませんよね? そんな場合は中間テーブルを使って、多対多結合を表現するのがベストプラクティスです。 多対多結合ついて詳しくはググってください。 以下の3つのテーブルがあったとして estatesテーブル id(主キー) name(ユニーク) tagsテーブル id (主キー) name(ユニーク) estates_tagsテーブル tag_id(主キー) estate_id(主キー) SQLはこんな感じで ``` SELECT estates.name FROM estates INNER JOIN estates_tags ON estates_tags.estate_id = estates.id INNER JOIN tags ON estates_tags.tag_id = tags.id WHERE tags.name = "神奈川県" OR tags.name = "ペット可" GROUP BY estates.name HAVING COUNT(0) = 2 ``` テーブルも追記します。 ``` CREATE TABLE estates(id int PRIMARY KEY, name varchar(255) UNIQUE); CREATE TABLE tags(id int PRIMARY KEY, name varchar(255) UNIQUE); CREATE TABLE estates_tags( estate_id int NOT NULL, tag_id int NOT NULL, PRIMARY KEY(estate_id, tag_id), FOREIGN KEY(estate_id) REFERENCES estates(id), FOREIGN KEY(tag_id) REFERENCES tags(id)); INSERT INTO estates (id, name) VALUES (1, 'サンプル建設'), (2, 'サンプル不動産'); INSERT INTO tags (id, name) VALUES (1, '神奈川県'), (2, 'ペット可'), (3, '東京都'); INSERT INTO estates_tags(estate_id, tag_id) VALUES (1, 1), (1, 2), (2, 3), (2, 2) ```