2011-05-31 201 views
2

我正在嘗試構建產品的過濾系統。產品有許多屬性,包括價格,尺寸(釐米)和(#)的側面。我想構建一個SQL查詢,它總是返回ALL這些產品,但是會根據它們符合搜索條件的順序對它們進行排序。SQL查找近似匹配

例如可以說我有以下產品:

產品A 價格:250 尺寸:50個 面:4

產品B 價格:300 尺寸:60 面積:3

產品C 價格:200 尺寸:60個 側面:5

而且具有的搜索條件:

價格:$器210 - $ 260

我想它返回: 商品A,商品C,產品B

A首先是因爲它符合所有搜索條件。 C領先於B,因爲200美元最接近210美元-260美元範圍,而不是300美元。

這是一個相當簡單的情況,但搜索可能涉及任何屬性。

我腦海中的算法是對每個屬性做一些標準偏差計算,它會給你一個關於該屬性滿足搜索標準的密度的「分數」,這些分數可以被歸結爲一個產品給出產品的相關性總分。那是沿着正確的軌道嗎?

我意識到這是一個相當複雜的問題,我真的只是尋找一些指導而已。

+2

我認爲你有你的A,B和C混合起來。 B應該首先歸還,因爲它在價格範圍內。 C應該返回第二個(10美元以外),然後A(40美元以外)。 – 2011-05-31 05:09:54

+0

哎呀......你說得對。我將進行編輯。 – Mike 2011-05-31 21:16:04

回答

4

基本上你必須爲每一行提供一個「距離」函數,如果所有條件都匹配,則返回0,否則返回一個正值表示距離多遠。每個不同的列將不得不具有一定的權重,因爲減少1美元並不像離開1個方面那麼遙遠。如果價格低於210,則未加權距離將是(210 - 價格),如果價格超過260,則價格列的未加權距離將是(價格-260)。然後,您可以將加權距離加起來w1 * price_distance + w2 * size_distance + s3 * sides_distance。然後你可以按距離做一個訂單。

+0

正是我需要的!謝謝! – Mike 2011-05-31 06:55:55

3

如何計算平均值,然後通過偏離平均值的順序進行排序?我想象這樣的事情(很明顯,你的表/列名會有所不同):

SELECT 
    p.price, 
    p.size, 
    p.sides, 
    ABS(p.price - 235) AS distance 
FROM 
    products p 
ORDER BY 
    distance; 

當然,你可能也想在IF函數拋出來評估價格是否是在範圍內,我建議在後面使用參數化查詢,而不是直接輸入平均值。

+0

根據其他評論者,您也可能想要爲每個屬性分配一個權重,將它們彼此歸一化,然後將它們相加。例如,ABS(p.price - 235)* 0.2 AS price_distance,ABS(p.size - 45)* 2.5 AS size_distance,ABS(p.sides - 3)* 20 AS side_distance,price_distance + size_distance + side_difference AS total_deviation。 – 2011-05-31 05:34:17

+0

兩個很好的答案。謝謝! – Mike 2011-05-31 06:58:21