5

大家好,新年快乐

情况:

我在 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        |
|.....
|--------+------------|

Metrics:(唯一 ID,唯一 MetricName)

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

对于给定的对象 ID:

  • 在“0”和“每个指标一个”之间会有许多分数

要求:

对于给定的 ObjectID,我想根据以下条件返回一个排序列表:

  • 返回的行按与所提供对象的相似度排序
  • 返回的行不包括提供的对象
  • (这是我认为的难点)相似度的顺序由对象与提供的对象的“得分距离”决定,基于其得分与提供的对象得分的数字偏移/差异,对于任何有条目的度量,提供的和当前检查的对象
  • 包含对象 ID、对象名称、分数差异(或类似内容)

问题陈述:

我不知道为此使用的正确 SQL 语法,而且我的实验到目前为止都失败了。我想尽可能多地在数据库中完成这项工作,并且很少或根本没有在代码或类似代码中的讨厌的 for 循环中完成这些工作。

额外的非功能

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

1 回答 1

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

SQL Fiddle 上的实时示例。

于 2013-01-01T14:55:12.363 回答