2012-02-27 17 views
5

mysqlで、値が別のテーブルのいくつかのフィールドに含まれているかどうかを確認するにはどうしたらいいですか?MySQL - 好きではない

SELECT * FROM table WHERE concat('%',value,'%') NOT LIKE IN(SELECT field FROM anothertable) 

しかし、私はそれはそれは、かなり右だとは思わないような何か?

答えて

2

次のクエリを実行する必要があります。

SELECT DISTINCT t.* 
FROM table t, 
     anothertable a 
WHERE a.field NOT LIKE Concat('%', t.`value`, '%'); 
+0

これは何らかの方法でより速くまたはより良いでしょうか? –

+0

はい、フィールドと値がインデックス化されていると、はるかに高速になります –

+0

私は2つを比較しましたが、これは最初の4倍高速です。 –

2

いいえ、あまりありません。

SELECT * FROM table WHERE NOT EXISTS (
    SELECT * from anothertable WHERE field LIKE CONCAT('%',value,'%') 
) 

です。 valuetableの列であり、fieldanothertableの対応する列であり、部分文字列としてvalueを含む場合もあります。

anothertableに多くの行が含まれていると、これは非常に遅いクエリになります。私はあなたを助けることができるインデックスがあるとは思わない。 MySQLはtableの行ごとに文字列比較テーブルanothertableをスキャンする必要があります。

+0

私はそれが遅くなることだろう考え出ししかし、私は一度だけメンテナンスクエリを実行しています。 –

+0

Btw、私はタイプミスのために更新しました - 私は 'LIKE'の代わりにサブクエリに '好きではありませんでした。 –

+0

ええ、私はそのタイプミスをキャッチしました。 –

0

私が正しくあなたの質問を理解していれば(あなたは「anothertable」の2つのフィールド(フィールド1とフィールド2)のテーブルから値を見つけたいと仮定した場合):

SELECT * 
FROM table t 
WHERE EXISTS (SELECT Count(*) FROM anothertable WHERE field1 LIKE concat('%',t,value,'%') OR field2 LIKE concat('%',t,value,'%') 
関連する問題