2012-11-12 39 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

請包括一個完整的示例,並以您想要的順序記錄多個記錄。例如,如果搜索包含「40%的最低評審」,那麼對「99%」的評審是在評審「41%」之前還是之後?事實上,我認爲訂單標準和搜索標準應該是分開的:「MinReview = 40%,MinPrice = 10。00;價格ASC,評論DESC' *(我特意將此更改爲MinPrice,用於下一個示例)*。當包括不完全匹配的記錄時,***正好***你想要什麼? '39%,10.00'之前或之後應該有'40%,9.99'嗎? – MatBailie

回答

6

基本原則是爲每條記錄創建一個相關性分數,然後按此排序。

如果你想每個標準有相同的權重,在MySQL中,你可以只添加每個布爾表達式在一起(注意,這是不規範的其他RDBMS SQL —您可能需要使用CASE要測試的條件和產生數):

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

如果條件不相等地加權,則可以通過其重量乘以每個表達式:

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

和/或如果壽SE匹配某個子集應該總是出現先不管以後的結果,您可以將您的ORDER BY條款:

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

如果你想看到在搜索結果的相關性得分,你同樣可以添加任何的上述表達式您SELECT(然後在你的ORDER BY子句中使用生成的列,以避免寫了兩遍):

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

請注意,如果您想獲得具有最接近於某個目標的值記錄(例如min_review接近40%,而不是精確的),你可以把它和你的目標值之間的(絕對)的區別:

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

但是,你一定要小心,適當地加權你的表情,如果/當相結合其他人在一個單一的標準。

+0

距離分數有一個問題,即Op說邊界錯誤一側的* anything *應該出現在邊界右邊的* everything *之後。因此,對於條件'MaxPrice = 10.00',在每個*價格從10.00和更低,甚至低到0.01的價格之後,都會有'價格= 10.01'。它也沒有考慮訂單偏好 - 說MaxPrice = 10.00'實際上並不告訴你,如果搜索者喜歡'Price = 0.01'或者他們更喜歡'Price = 9.99'。這些是在最終算法中使用的有用組件,但不是*(在我看來)*最終答案或方法。 – MatBailie

+0

這個解決方案(至少是第一個'order by'子句)*會將所有匹配放在部分匹配之上。我認爲這回答了這個問題。 –

+0

謝謝,這個作品! – Femke