絞込み検索を作りたいと思っております。
例えば、あるテーブルのデータ構造が下記の様に
なっていたとします。
1 3 東京
2 3 A型
3 4 千葉
4 4 B型
フィールドは左から、通し番号、メンバー番号、その他となります。
上のテーブルのその他フィールを対称に、東京とA型をAND検索したとします。
すると、もちろんの事ながら、一件も引っかかりません。
これを、東京とA型と二つのレコードを持つ、メンバー番号の3の人を引っかからせる様にするにはどうすればいいでしょうか?
質問が下手ですみません。。。
テーブル構造に問題が有る気もしますが、
SELECT メンバー番号 FROM テーブル WHERE その他 IN ( '東京','A型' ) GROUP BY メンバー番号 HAVING count(*) = 2;
という感じかな。
3|東京 A型
or検索でいかがでしょうか?3を絶対含んで、東京かA型のどちらかを含むように検索・・・
「3+東京」 or 「3+A型」 という意味です。
まぁ例だからだと思うんですが・・同じ人の情報なら横にいくつか登録したほうが簡単っていう突っ込みはいらないですよね?
番号 都道府県 血液型
1 千葉 A
2 東京 B
3 埼玉 O
既に解決済かも知れませんが、参考まで。
その1:
select distinct メンバー番号 from テーブル
where メンバー番号 in (select メンバー番号 from テーブル where その他='東京')
and メンバー番号 in (select メンバー番号 from テーブル where その他='A型');
その2:
SELECT t1.メンバー番号 FROM テーブル t1, テーブル t2
where t1.メンバー番号 = t2.メンバー番号 and t1.その他='東京' and t2.その他='A型';
もし、テーブル定義をまだ変えられるのであれば・・・
属性を追加して、
通し番号 | メンバー番号 | 属性 | その他 |
---|---|---|---|
1 | 3 | 地域 | 東京 |
2 | 3 | 血液型 | A型 |
3 | 4 | 地域 | 千葉 |
4 | 4 | 血液型 | B型 |
※ ただし、unique(メンバー番号, 属性)
を前提に、以下で取得しやすい気がします。
その3:
SELECT メンバー番号 from テーブル
where (属性='地域' and その他='東京')
or (属性='血液型' and その他='A型')
group by メンバー番号
having count(属性) = 2;
※ 検証は、MySQLでやっていませんが、多分大丈夫だと思います。
実際に実行計画を取得してみないと分かりませんが、「その1」と「その3」はインデックスの張り方で、良くなると思いますが、「その2」は、たぶん項目が多くなると、一気にパフォーマンスが劣化するような・・・気がします(笑)。
あ・・・夜が明ける・・・
皆さんありがとうございました!
解決しました。