Nice programing

하나의 레코드에서 여러 단어를 일치시키는 MySQL SELECT LIKE 또는 REGEXP

nicepro 2020. 11. 26. 19:52
반응형

하나의 레코드에서 여러 단어를 일치시키는 MySQL SELECT LIKE 또는 REGEXP


필드 table. name'Stylus Photo 2100'과 다음 쿼리가 포함되어 있습니다.

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus 2100%'

결과가 없습니다. 물론 내가 검색한다면

SELECT `name` FROM `table` WHERE `name` LIKE '%Photo 2100%'

'Stylus 2100'을 검색하여 레코드를 선택하려면 어떻게해야합니까?

감사


단어의 순서를 안다면 .. 다음을 사용할 수 있습니다.

SELECT `name` FROM `table` WHERE `name` REGEXP 'Stylus.+2100'

또한 다음을 사용할 수 있습니다.

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%' AND `name` LIKE '%2100%'

가장 좋은 해결책은 정규 표현식을 사용하는 것입니다. 가장 깨끗하고 아마도 가장 효과적 일 것입니다. 정규식은 일반적으로 사용되는 모든 DB 엔진에서 지원됩니다.

MySql에는 RLIKE연산자가 있으므로 쿼리는 다음과 같습니다.
SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus|2100'
나는 정규 표현식에서 그다지 강하지 않으므로 표현식이 괜찮기를 바랍니다.

편집
RegExp는 다음과 같아야합니다.

SELECT * FROM buckets WHERE bucketname RLIKE '(?=.*Stylus)(?=.*2100)'

MySql regexp 지원에 대한 추가 정보 :
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp


각 공간을 %

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'

올바른 솔루션은 전체 텍스트 검색 (사용할 수있는 경우)입니다. https://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

이것은 거의 원하는 것을 수행합니다.

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100)+.*(Stylus|2100)+';

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*';

그러나 이것은 또한 좋지 않은 "210021002100"과 일치합니다.


이런 식으로해야합니다.

SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus.*2100';

또는

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus)+.*(2100)+';

귀하의 검색이 stylus photo 2100. 다음 예제를 사용하여 RLIKE.

SELECT * FROM `buckets` WHERE `bucketname` RLIKE REPLACE('stylus photo 2100', ' ', '+.*');

편집하다

또 다른 방법은 에서 FULLTEXT인덱스 bucketnameMATCH ... AGAINST구문 을 사용하는 것입니다 SELECT. 따라서 위의 예를 다시 작성하려면 ...

SELECT * FROM `buckets` WHERE MATCH(`bucketname`) AGAINST (REPLACE('stylus photo 2100', ' ', ','));

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus % 2100%'

참고 URL : https://stackoverflow.com/questions/9099469/mysql-select-like-or-regexp-to-match-multiple-words-in-one-record

반응형