SQLを成形してAND検索を実現する際、
アプローチの仕方によってAND検索の実現方法が違ってきます。
- 特定のレコードに対して、AND検索を実現する
- 複数のレコードに対して、AND検索を実現する
1. 特定のレコードに対して、AND検索を実現する
以下のようなテーブル(fruits)があるとします。
id | shop_id | name |
1 | 1 | apple |
2 | 1 | orange |
3 | 2 | apple and orange |
この時、appleかつorangeの単語が含まれるレコードを取得したいとします。
appleやorangeだけではダメで、
両方の単語が入っていることが条件となります。
これは以下のSQLを成形することで実現することができます。
(ここではid:3が取得できます)
SELECT * FROM fruits WHERE name LIKE ‘%apple%’ AND name LIKE’ %orange%’;
SQLのWHERE句にANDを使って検索したい条件を
くっつけるだけで実現できます。
2. 複数のレコードに対して、AND検索を実現する
今度は特定のレコードではなく、
複数のレコードをまたいでAND検索を実現したいとします。
例えば、appleとorangeを扱っているお店のIDを取得したい場合など。
(id:3は、appleとorangeのセット商品のようなもので、便宜上、今回の検索対象とは違うものとお考えください)
これは以下のSQLを成形することで実現することができます。
(ここではshop_id:1の2件が取得できます)
SELECT * FROM fruits WHERE shop_id IN ( SELECT t1.shop_id FROM ( SELECT DISTINCT(shop_id) FROM fruits WHERE name = ‘apple’) t1, ( SELECT DISTINCT(shop_id) FROM fruits WHERE name = ‘orange’) t2 WHERE t1.shop_id = t2.shop_id)
SELECTとDISTINCTを使って、複数回のサブクエリを実行しています。
少しややこしいですが、これで複数レコードをまたいだ
AND検索が実現できます。