MySQL을 "최적 일치"별로 주문
실시간 검색을 사용하여 해당 테이블을 검색할 수 있는 단어와 입력 필드가 포함된 테이블이 있습니다.현재 다음 쿼리를 사용하여 테이블을 검색합니다.
SELECT word FROM words WHERE word LIKE '%searchstring%' ORDER BY word ASC
단어의 선두에 문자열이 있는 것이 먼저이고 뒤에 문자열이 나오는 것이 마지막에 오도록 결과를 정렬하는 방법이 있나요?
예: 'hab'을 검색하면 현재 반환됩니다.
- 반음계
- habit
- ehab을 실행하다
이런 식으로 했으면 좋겠어
- hab it ('hab'이 시작이므로 최초)
- alp hab et ('hab'이 단어 중간에 있기 때문에 두 번째)
- re hab('hab'이 단어의 끝에 있기 때문에 마지막)
또는 적어도 이 방법:
- hab it ('hab'이 시작이므로 최초)
- re hab('hab'이 세 번째 문자로 시작되므로 두 번째)
- alp hab et ('hab'이 네 번째 문자로 가장 늦게 시작되므로 마지막)
누가 좀 도와주면 좋을 텐데!
첫 번째 방법(단어 시작, 단어 중간, 단어 끝)을 사용하려면 다음과 같이 하십시오.
SELECT word
FROM words
WHERE word LIKE '%searchstring%'
ORDER BY
CASE
WHEN word LIKE 'searchstring%' THEN 1
WHEN word LIKE '%searchstring' THEN 3
ELSE 2
END
두 번째 방법(일치된 문자열 위치)을 사용하려면 다음 함수를 사용합니다.
SELECT word
FROM words
WHERE word LIKE '%searchstring%'
ORDER BY LOCATE('searchstring', word)
예를 들어, 두 개 이상의 단어가 다음 문자로 시작하는 경우를 대비해서 타이브레이크를 사용할 수도 있습니다.hab
그러기 위해서는 다음을 권장합니다.
SELECT word
FROM words
WHERE word LIKE '%searchstring%'
ORDER BY <whatever>, word
여러 단어로 시작하는 경우hab
, 로 시작하는 단어hab
그룹화되어 알파벳 순으로 정렬됩니다.
다음과 같이 시도해 보십시오.
SELECT word
FROM words
WHERE word LIKE '%searchstring%'
ORDER BY CASE WHEN word = 'searchstring' THEN 0
WHEN word LIKE 'searchstring%' THEN 1
WHEN word LIKE '%searchstring%' THEN 2
WHEN word LIKE '%searchstring' THEN 3
ELSE 4
END, word ASC
를 사용할 수 있습니다.INSTR
단어 내 검색 문자열의 시작 위치를 반환하는 함수입니다.
ORDER BY INSTR(word,searchstring)
검색 문자열이 두 개의 다른 단어로 동일한 위치에 표시될 때 결과 세트를 보다 확실하게 하려면 ORDER BY에 두 번째 식을 추가합니다.
ORDER BY INSTR(word,searchstring), word
(예를 들어 searchstring)hab
양쪽의 두 번째 위치에 나타나다chablis
그리고.shabby
)
고객님의 경우 다음과 같습니다.
ORDER BY INSTR(word, '%searchstring%')
INSTR
에서 검색하다word
의 칼럼을 쓰다.'%searchstring%'
다시 제자리로 돌아가면 매치가 안 되면0
결과가 순서대로 내려가는 원인이 됩니다.
방향을 변경하기 위해 다음과 같이 DESC를 추가할 수도 있습니다.
ORDER BY INSTR(word, '%searchstring%') DESC
언급URL : https://stackoverflow.com/questions/18725941/mysql-order-by-best-match
'programing' 카테고리의 다른 글
Java에는 버퍼 오버플로우가 있습니까? (0) | 2022.09.15 |
---|---|
PHP curl을 사용한HTTP 기본 인증을 사용하여 어떻게 요청합니까? (0) | 2022.09.15 |
문자열이 Unix 타임스탬프인지 확인합니다. (0) | 2022.09.15 |
Vue CLI 3: 정의된 출력 경로 (0) | 2022.09.15 |
mysql에서 읽지 않은 기사를 가져오기 위한 데이터베이스 설계(1억 개 이상의 행 테이블) (0) | 2022.09.15 |