2012-12-12 51 views
1

我會分成兩個部分本的最佳匹配:查找MySQL的用戶排名列表

  1. 我有一個用戶使用產品的列表「功能」,他的慾望。要求用戶對1-10這些功能進行排名。我也有一張裝滿產品的桌子。這些產品中的每一個都有各種功能。一些產品將具有1-10的所有特徵,但是一些僅具有少數特徵。我想確定哪個產品與用戶的排名最匹配,併爲用戶提供有序的結果集,最好匹配第一,最差匹配最後。

  2. 上述查詢實際上只是用戶正在做的一部分。用戶還提供其他搜索標準(例如產品類別,價格等)以及特徵排名。所以,我希望功能匹配僅適用於通過此組過濾器的產品。我將如何結合這些?

我發現像thisthis一些類似的問題,但他們沒有足夠接近,我要弄清楚如何將這些解決方案適用於我的情況。

的表參與是這個樣子:

產品(ID,產品)

功能(ID,功能)

product_features(ID,PRODUCT_ID,FEATURE_ID)

和用戶將通過像這樣的陣列提交他的搜索(其中密鑰實際上是特徵ID,並且等級是該值):

[users_features] => Array 
    (
     [1] => Array 
      (
       [rank] => 9 
      ) 

     [2] => Array 
      (
       [rank] => 1 
      ) 

     [3] => Array 
      (
       [rank] => 3 
      ) 

(這將是一個10項陣列的權利,但可能會在未來改變)

) 
+0

我在這裏看到的一個問題是,具有所有功能的產品將總是排在列表的頂部 - 除非那可以。 –

+0

您需要一種將排名應用到功能的方法。例如,如果一個產品只匹配rank = 1,但另一個匹配rank = 2和3,選擇哪個? –

+0

@EricPetroelje沒關係,如果所有具有所有功能的產品排在最前面。 – HipN

回答

0

我不能完全得到這隻能使用SQL工作,但一個簡單的PHP解決方案將類似於以下(未經測試):

//Array of $productId => list of feature ids 
$products; 
$userFeatures; 
$scores = array(); 
//For every product work out a score based on features and user ranking. 
foreach($products as $productId => $prodFeatures){ 
    $score = 0; 
    foreach($prodFeatures as $feature){ 
     //Could also perhaps penalise products lacking features. 
     $score += $userFeatures[$feature]["rank"]; 
    } 
    $scores[$productId] = $score; 
} 
arsort($scores); 
echo "Best match is ".$scores[0]; 

顯然這是有點粗糙和準備,但希望它可以幫助。

編輯:這假定排名10是最好的。

+0

你的得分概念和使用10作爲最佳排名有很大意義。我已經運行了一些電子表格場景,並且它表現得相當不錯。你會推薦我先運行'過濾器'查詢,然後從該結果集中構建一個產品陣列並跳轉到這個評分函數中? – HipN

+0

我用你的方法結束了。我運行了我的過濾器查詢,然後使用該結果中的一系列產品ID來開始此評分例程。謝謝! – HipN

0

解決方案是將用戶等級除以1。例如1/R。然後總結所有的可能性並按照後代的順序對列表進行排序。 1/R也是不能從列表中選擇該產品的機會。當你需要對數值進行歸一化處理或者將這些數值的總和等於1時,你需要將數值乘以所有值的重新和。例如r1 = 30和r2 = 15。 1 /(1/30 + 1/15)= 10,所以P1 = 10×1/30 = 1/3,P2 = 10×1/15 = 2/3。當您將值標準化時,這也意味着具有較少屬性的產品也不太可能。

+0

這似乎很有趣,但對於我的生活,我不太明白如何應用它。你的例子中的r1和r2是特徵1和特徵2的等級? P1和P2產品1和2? – HipN

+0

1)是2)否。 P1和P2也是這個功能的行列,但歸一化使得所有的總和爲1. – Bytemain

+0

啊!我現在明白了...作爲一種基於其功能評分每種產品的方法是有意義的,並且仍然使用1作爲最高等級。你有關於如何構建查詢的建議嗎? – HipN