20

MySQL でクエリを実行するORには、ステートメントで使用できると常に考えていました。LIKEしたがって、連続する複数のフィールドを 1 つのキーワードまたは用語と比較したい場合は、次のようにします。

SELECT * FROM MyTable WHERE Column1 OR Column2 LIKE '%keyword%'; 

そして、比較する単語の配列がある場合:

SELECT * FROM MyTable WHERE Column1 OR Column2 LIKE '%keyword1%' 
AND Column1 OR Column2 LIKE '%keyword2%';

ただし、構文が正しいとは思いません。次のようなものとは別に、これを書く効率的な方法はありますか?

SELECT * FROM MyTable WHERE Column1 LIKE '%keyword1%' OR Column2 LIKE 
'%keyword1%' AND Column1 LIKE '%keyword2%' OR Column2 LIKE '%keyword2%';

私はこれについて正しく行っていますか?

4

2 に答える 2

34

これを使って::

SELECT * FROM MyTable WHERE (Column1 LIKE '%keyword1%' OR Column2 LIKE 
'%keyword1%') AND (Column1 LIKE '%keyword2%' OR Column2 LIKE '%keyword2%');
于 2012-06-19T18:18:52.303 に答える
24

希望する構文に最も近いものは次のとおりです。

SELECT * FROM MyTable
WHERE (CONCAT(Column1, Column2) LIKE '%keyword1%')
AND (CONCAT(Column1, Column2) LIKE '%keyword2%')

注: 検索文字列の先頭に「%」があると、インデックスを使用できなくなります。検索するレコードが大量にある場合は、実装を再考することをお勧めします。

各列が NULL でないことを保証できない場合は、代わりに CONCAT_WS を使用します。

SELECT * FROM MyTable
WHERE (CONCAT_WS("-", Column1, Column2) LIKE '%keyword1%')
AND (CONCAT_WS("-", Column1, Column2) LIKE '%keyword2%')

この CONCAT_WS ソリューションには、キーワードに存在しない区切り文字を選択した場合に、Column1 または Column2 でのみ「キーワード」の一致を保証するという利点もあります。

于 2012-06-19T18:29:11.913 に答える