MySQL:如何通过多行的数字差异来命令SQL查询结果?

我有下表,我的目标是搜索与其他特定客户最相似的客户如何评价某些制造商.此示例可在此SQL fiddle中找到.

customer    manufacturer    rating
A           Manuf_A         8
A           Manuf_B         3
B           Manuf_A         4
B           Manuf_Y         3        
C           Manuf_X         3
C           Manuf_Y         7
D           Manuf_A         8
D           Manuf_B         7

例:

我们希望找到哪些客户最适合拥有两家制造商评级的客户’A’,manuf_A和manuf_B.

期望的结果:

customer    difference
D           4          
B           7
C           11

预期算法:

>差值越小,两个客户的关系越密切
>如果客户未与主题客户共享任何制造商评级,则其不存在的评级应为零.

B差异:

abs(A.manuf_A.rating (8) - B.manuf_A.rating(4)) = 4 
abs(A.manuf_B.rating (3) - B.manuf_B.rating(Doesn't exist/0)) = 3
= 4 + 3
= 7

C差异:

abs(A.manuf_A.rating (8) - C.manuf_A.rating(Doesn't exist/0)) = 8
abs(A.manuf_B.rating (3) - C.manuf_B.rating(Doesn't exist/0)) = 3
= 8 + 3
= 11

差异:

abs(A.manuf_A.rating (8) - D.manuf_A.rating(8)) = 0
abs(A.manuf_B.rating (3) - D.manuf_A.rating(7)) = 4
= 0 + 4
= 4

关于如何在MySQL中完成此任务的任何建议都会得到很好的接受以及替代方法的任何建议.

最佳答案
这是一种方法.为客户和“A”评级的制造商生成所有行.然后使用左连接查找任何给定客户评定的那些.其余的只是算术:

select c.customer,
       sum(abs(am.rating - coalesce(cd.rating, 0))) as similarity
from (select cd.manufacturer, cd.rating
      from centraldatabase cd
      where cd.customer = 'A'
     ) am cross join
     customers c left join
     centraldatabase cd
     on cd.manufacturer = am.manufacturer and cd.customer = c.customer
group by c.customer
order by similarity asc;

这是一个SQLFiddle.注意:我不知道在SQL Fiddle中创建自己的模式是否是个好主意.

转载注明原文:MySQL:如何通过多行的数字差异来命令SQL查询结果? - 代码日志