2013-01-01 30 views
4

您好所有和新年快樂的MySQL如何通過多個屬性行的相似性進行排名的對象

狀況:

我在MySQL數據庫的一些表:

成績: (唯一ID,唯一的(的objectID,metricID))

| ID  | ObjectID | MetricID | Score | 
|--------+----------+----------+----------| 
|0  | 1  | 7  | 0  | 
|1  | 5  | 3  | 13  | 
|2  | 7  | 2  | 78  | 
|3  | 7  | 3  | 22  | 
|..... 
|--------+----------+----------+----------| 

對象: (唯一ID,惟一ObjectName)

| ID  | ObjectName | 
|--------+------------| 
|0  | Ook  | 
|1  | Oop  | 
|2  | Oww  | 
|3  | Oat  | 
|..... 
|--------+------------| 

度量: (唯一ID,唯一MetricName)

| ID  | MetricName | 
|--------+------------| 
|0  | Moo  | 
|1  | Mar  | 
|2  | Mee  | 
|3  | Meep  | 
|..... 
|--------+------------| 

對於給定的對象ID:

  • 將有一個數字 '0' 之間的分數的和'每個度量單位'

需要量:

對於給定的對象ID,我想返回基於以下標準排序列表:

  • 返回以相似度順序排列所提供的對象行
  • 返回行不包括提供的對象
  • (這是我認爲的難點)相似性的順序由對象根據所提供對象的「得分距離」確定,基於其得分與所提供對象的得分之間的數值偏移/差異其中有提供和兩個條目當前檢查的對象
  • 包含的objectID,對象名稱,分差(或類似的東西)

問題陳述:

我不知道用這個正確的SQL語法,到目前爲止我的實驗都失敗了。我希望儘可能在數據庫中完成這項工作,並且很少或完全沒有在代碼或類似的惡意for循環中完成此項工作。

額外的非函

  • 目前有在成績表中只有200行。我的計算表明最終可能會有大約2,000,000行,但可能不會超過。
  • 對象表僅會達到行
  • 到5000左右的指標表僅會達到約400行
+1

小子,你必須是一名軟件工程師。 +1以非常好的格式提問 –

+1

可以顯示樣本數據的預期輸出嗎? – Barmar

+0

我很難理解你對相似性順序的描述。 _score distance_與_score offset_相同嗎? _provided object_與_searched-for object_相同嗎? – Barmar

回答

1

下面是基於他們的相似性物品1 Order對象的方法:

select other.ObjectID 
,  avg(abs(target.Score - other.Score)) as Delta 
from Scores target 
join Scores other 
on  other.MetricID = target.MetricID 
     and other.ObjectID <> target.ObjectID 
where target.ObjectID = 1 
group by 
     other.ObjectID 
order by 
     Delta 

相似性被定義爲常用度量的平均差異。未列出與對象1不共享至少一個指標的對象。如果這個答案讓錯誤的假設,隨時澄清你的問題:)

Live example at SQL Fiddle.

+0

感謝您的回答。這看起來相當不錯,只是稍微適應了我的實際情況(略低於通用),並在接受答案之前進行驗證。 – specialsauce

+0

我已經驗證了一個真實的數據集,這個答案的一個稍微改編版本完全適合我,所以標記爲接受。通過閱讀並理解您的解決方案的工作方式,我也學到了很多關於如何思考這些東西的知識。優秀的東西,謝謝。 – specialsauce

相關問題