MySQL如何通过多个属性行的相似性对对象进行排名

时间:2013-01-01 14:28:00

标签: mysql sql database select

大家好,新年快乐

状况:

我在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语法,到目前为止我的实验都失败了。我想在数据库中尽可能多地完成这项工作,并且在代码或类似的讨厌的for循环中完成这项工作很少或没有。

其他非功能性

  • 目前Scores表中只有200行。我的计算表明,最终可能会有大约2,000,000行,但可能不会更多。
  • 对象表格最多只能有5000行
  • Metrics表最多只能有400行

1 个答案:

答案 0 :(得分:1)

这是一种根据对象与对象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共享至少一个度量的对象。如果这个答案做出错误的假设,请随时澄清你的问题:)

Live example at SQL Fiddle.