簡體   English   中英

MySQL如何通過多個屬性行的相似性對對象進行排名

[英]MySQL how to rank objects by similarity of multiple property rows

大家好,新年快樂

情況:

我在MySQL db中有一些表:

分數:(唯一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”和“每個指標一個”之間會有多個分數

需求:

對於給定的ObjectID,我想根據以下條件返回排序列表:

  • 返回的行按照與提供的對象的相似性順序排列
  • 返回的行不包括提供的對象
  • (這是我認為的難點)相似性的順序取決於對象與所提供對象的“得分距離”,這取決於其得分與所提供對象得分的數字偏差/差異。提供的和當前檢查的對象
  • 包含objectID,對象名稱,分數差異(或類似的東西)

問題陳述:

我不知道用於此的正確SQL語法,到目前為止我的實驗都失敗了。 我想盡可能多地在DB中完成這項工作,並且在代碼或類似的討厭的for循環中完成這項工作很少或根本沒有。

其他非功能性

  • 目前,Scores表中只有200行。 我的計算表明,最終可能有大約2,000,000行,但可能不會更多。
  • Objects表最多只能有5000行
  • Metrics表最多只能有400行

這是一種基於對象與對象1的相似性來對對象進行排序的方法:

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共享至少一個度量的對象。 如果這個答案做出錯誤的假設,請隨時澄清你的問題:)

SQL Fiddle的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM