dポイントプレゼントキャンペーン実施中!

MySQL ver.5.1を使用。

メールアドレス帳(数千件)より、宛名に特定のキーワードが含まれる行のみ選択したいと考えてます。
対象となるキーワードが多数ありすぎるため、別テーブルに格納してあります。

副問い合わせ(IN)を使用して、
下記テーブル:mail_listのname列のうち、
テーブル:keywordの値を含む行のみ抽出したいと思います。

完全一致『受付』⇔『受付』といったようなものであれば、
SELECT * FROM mail_list WHERE name IN (SELECT name FROM keyword);
で結果が得られるのですが、

『技術部』⇔『部』、『営業部』⇔『部』
のように部分一致させるという条件の場合、方法がなかなか思いつきません。
どのようなSQLで実現できますか。
ご教示くださいませ。

■テーブル:mail_list
id | name | address |
――――――――――――――
1 | 技術部 | aaa@aaaa |
2 | 営業部 | bbb@bbbb |
3 | 駐車場 | ccc@cccc |
4 | 受付 | ddd@dddd |
5 | 社長室 | eee@eeee |

■テーブル:keyword
name |
――――
受付 |
部 |
×× |
○○ |
△△ |

A 回答 (2件)

こんな感じでいかがでしょう。


keyword を主にしたクエリです。

SELECT ml.* FROM keyword kw
INNER JOIN mail_list ml
ON (0<LOCATE(kw.name,ml.name))
GROUP BY ml.id;

また、EXISTS を使う方法もあります。

SELECT * FROM mail_list ml
WHERE EXISTS
(SELECT 1 FROM keyword kw
WHERE 0<LOCATE(kw.name,ml.name));

ちなみに正規表現や LIKE を使うのであれば、
keyword のデータに特殊文字が含まれる場合の注意が必要です。
例えば、正規表現では「(」「)」や「|」、LIKE では「%」や「_」などです。
    • good
    • 0
この回答へのお礼

なるほど、、
LOCATEを使うんですね。両方式ともうまくいきました。
シンプルなSQL文で理解しやすかったです。

2パターンもご回答ありがとうございました。

お礼日時:2011/10/05 16:48

正規表現でどうでしょう?



SELECT * FROM mail_list WHERE name REGEXP ( SELECT group_concat(name SEPARATOR '|') FROM keyword )
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
ばっちり結果が得られました!

REGEXPとgroup_concatの組み合わせですね。
スゴイ!大変勉強になります。

お礼日時:2011/10/05 16:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!