2012-11-12 2 views
4

최상의 검색 결과로 내 쿼리에서 반환 된 결과 목록이 표시됩니다. 내가 할 수있는만큼 명확하게하려고 노력할 것이지만, 뭔가 명확하지 않은 것이 있으면 알려주세요. 나는 그것을 더 분명하게하려고 노력할 것입니다.가장 일치하는 SQL 쿼리를 주문하십시오

사용자가 이미 findsettings이라는 설정 목록을 입력했습니다. 이 findsettings으로 제품을 찾고 있습니다. 그가 최선의 경기를 분류해야 할 때까지이 모든 것이 잘 진행됩니다.

min_review, max_price, allows_pets, etc과 같은 몇 가지 필드가 있습니다.

주문하고 싶습니다. 예를 들어 min_review of 40%으로 제품을 주문한 다음 max_price = 10.00으로 주문한 다음 allows_pets = 0으로 주문해야합니다. OR으로 그 작업을 수행 할 수 있지만 목록의 맨 아래에만 일치하는 조용한 결과가 표시되기를 원합니다. 따라서 기본적으로 가장 일치하는 제품이 나올 때까지 가장 먼저 일치하는 항목을 표시하고 두 번째 항목, 세 번째 항목 등을 표시해야합니다.

나는 이것을 어떻게 처리해야할지 모르겠다. 그래서 나는 그것을 소트하도록 도와 줄 수 있기를 바란다.

+0

테이블 구조, 색인 및 쿼리 코드를 표시 할 수 있습니까? FULLTEXT 인덱스를 사용하고 MATCH AGAINST를 사용하려는 것처럼 들리지만 구조와 코드를 보지 않고 최상의 접근 방식을 말하기는 어렵습니다. – davidethell

+0

원하는 순서로 여러 레코드가 포함 된 전체 예제를 포함하십시오. 예를 들어, "Min Review of 40 %"가 포함 된 검색의 경우 "41 %"의 검토 전후에 "99 %"의 검토가 있어야합니까? 나는 사실상 주문 기준과 검색 기준이 분리되어야한다고 제안 할 것이다 :'MinReview = 40 %, MinPrice = 10.00; 가격 ASC, 검토 DESC' * (다음 예제에서 MinPrice로 변경했습니다.) *. 정확히 일치하지 않는 레코드를 포함 할 경우 *** 정확히 *** 원하는 것은 무엇입니까? '39 %, 10.00' 전후에'40 %, 9.99'가 올 것인가? – MatBailie

답변

6

기본 원칙은 각 레코드에 대한 관련성 점수를 작성한 다음이를 기준으로 정렬하는 것입니다.

각각의 조건이 같은 가중치를 갖기를 원한다면, MySQL에서 각 부울 표현식을 함께 추가하면됩니다 (비 RDBMS의 비표준 SQL —입니다). 조건을 테스트하고 번호) :

ORDER BY 5*(review>=40/100) + 3*(price<=10.00) + 1*(allows_pets=0) DESC 

그리고/또는 상점 경우를 : 기준이 동일하게 가중되지 않은 경우, 당신은 그 무게에 의해 각 표현식을 곱 수 있습니다

ORDER BY (review>=40/100) + (price<=10.00) + (allows_pets=0) DESC 

당신이 유사 중 하나를 추가 할 수

ORDER BY 5*(review>=40/100) + 3*(price<=10.00) DESC, 
     1*(allows_pets=0) DESC 

당신이 결과의 관련성 점수를보고 싶어해야 : 항상 처음에 상관없이 나중에 결과를 표시 할 몇 가지 부분 집합에 맞게 자체는, 당신은 당신의 ORDER BY 절을 나눌 수 있습니다 SELECT하여 위의 식 (다음 ORDER BY 절에서 결과 열을 사용하여 두 번 작성 피하기 위해) :

SELECT *, 
     (review>=40/100) + (price<=10.00) + (allows_pets=0) AS relevance, 
FROM  my_table 
ORDER BY relevance DESC 

주 당신이 어떤 대상에 가장 가까운 값이 기록을 (가져올한다 예 ?, 당신이 당신의 목표 값 사이의 (절대) 차이 걸릴 수 있습니다) 40 %에 가까운보다는 정확한 min_review :

IF(review>=40/100, review-40/100, NULL) 

하지만를, 당신은 적절하게 표현 체중에주의해야합니다 경우 /와 결합 할 때 하나의 기준에있는 다른 것들.

+0

거리 스코어에는 경계선의 오른쪽에 * everything * 뒤에 경계면의 잘못된면에 * anything *이 표시되어야한다고 Op가 말합니다. 따라서 'MaxPrice = 10.00'조건에 대해서는 매주마다 '10.00'이하의 가격을 가진 * 모든 레코드 뒤에 '가격 = 10.01'이 있고 '0.01'가격까지 내려갑니다. 또한 'MaxPrice = 10.00'은 검색자가 가격 = 0.01을 선호하는지 아니면 '가격 = 9.99'를 선호 하는지를 알려주지 않는다. 이것들은 최종 알고리즘에서 사용하기에 유용한 구성 요소이지만 * (내 의견으로는) * 최종 대답이나 접근법이 아닙니다. – MatBailie

+0

이 해결책 (적어도 첫 번째'order by' 절)은 부분 일치 이상의 모든 일치를 넣는다. 나는 이것이 질문에 대답한다고 생각한다. –

+0

고마워,이 작품! – Femke

관련 문제