source

변수 개수의 모수에서 여러 열을 검색합니다.

nicesource 2023. 10. 1. 19:32
반응형

변수 개수의 모수에서 여러 열을 검색합니다.

나는 사용자가 하나 이상의 단어를 입력할 수 있는 검색 입력 상자를 가지고 있고 php 스크립트는 모든 단어가 열에 포함된 모든 행을 반환해야 합니다.

다음과 같은 표를 가정합니다.

|car_id|make|model|year|plate|
+----------------------------+
|  1   |Audi|A4   |2010|AAAAA|
|  2   |Audi|A4   |2012|AAAAB|
|  3   |Audi|Q5   |2010|AAAAC|
+----------------------------+

사용자가 "Aud"를 입력하면 3개의 행을 얻게 됩니다.'2010 아우디'에 들어가면 1열과 3열을, '오디오 q5 2010'에 들어가면 3열만 받습니다.

내가 한 일.

만약 입력이 단지 1개의 항으로 이루어진다면, 나는 다음과 같은 쿼리를 만들 수 있습니다.

SELECT * FROM car WHERE make LIKE '%term%' OR model like '%term%' OR year like '%term%'

사용자가 2개의 항을 입력하면 대신 이 쿼리를 작성해야 합니다(플레이트 열은 고려하지 않음).

SELECT * FROM car WHERE 
     (make LIKE '%term%' AND model LIKE '%term2%') 
  OR (make LIKE '%term2%' AND model LIKE '%term%')
  OR (make LIKE '%term%' AND year LIKE '%term2%')
  OR (make LIKE '%term1%' AND year LIKE '%term%')
  OR (model LIKE '%term%' AND year LIKE '%term%')
  OR (model LIKE '%term2%' AND year LIKE '%term1%')

사용자가 3개의 항을 입력하면 쿼리가 기하급수적으로 더 복잡해집니다.

MATCH 키워드에 대해 읽었지만 일부 열은 텍스트가 아닙니다. 이 예제의 연도처럼 말입니다.

이런 종류의 검색을 하는 올바른 방법은 무엇입니까?데이터베이스 스키마를 변경해야 합니까?검색 가능한 모든 열을 문자열에 넣고 약간의 정규 함수를 수행합니다.

감사해요.

  1. 추가 열을 만듭니다.all. 그것에 포함시키세요.CONCAT_WS(' ', ...)검색해야 할 모든 열 중에서.
  2. 만들기FULLTEXT(all)그 열에 색인을 만듭니다.
  3. 단 하나의 절로 쿼리를 구성합니다.

    WHERE MATCH(all) AGAINST("+Audi +q5 +2010" IN BOOLEAN MODE)

문제:

  • FULLTEXT는 최소 단어 길이를 갖습니다. 를 변경하거나(아, 글로벌 설정입니다), 짧은 "단어"를 다르게 취급합니다.예를 들어, min word len이 3이라면, q5 앞에 있는 '+'를 제거합니다.AGAINST끈을 매다그렇지 않으면 InnoDB에서 행을 찾을 수 없습니다.
  • 마찬가지로 "멈춤말"을 다루게 됩니다.또는 중지 목록을 제거합니다.
  • 하이픈 등의 단어를 어떤 식으로든 처리합니다.
  • 하는 것이 도움이 될 것입니다.ORDER BY MATCH ... LIMIT 20(1) 오드볼 케이스에 약간의 선호를 부여하고, (2) 사용자가 충분히 지정하지 않은 경우 출력을 제한합니다.
  • 아니면 정정당당하게 경기를 하고 싶을 수도 있습니다.ORDER BY RAND() LIMIT 20.

5.7 또는 MariaDB를 사용하는 경우 "생성된" 열이 유용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/49073567/search-table-multiple-columns-on-variable-number-of-parameters

반응형