MySQL:如何根据多行的数值差异对SQL查询结果进行排序?

标签 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_Amanuf_B 进行了评级。 p>

期望的结果:

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

D 区别:

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”评级的客户和制造商生成所有行。然后使用 left join 找到任何给定客户评价的那些。剩下的只是算术:

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查询结果进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45244414/

相关文章:

php - 根据之前的选择选择字段

c# - 创建数据库和表

MySQL优化多连接查询

mysql - 如何防止MySQL用户定义变量冲突

mysql - JPA 如何构建连接条件查询

mysql - sql 不正确的日期时间值

mysql - SQL如何统计表的每个字段

MySql:获取所有匹配的行,直到某列的总和

php - 如何在单击时执行 mysql 请求?

sql - PostgreSQL:查找到目前为止的连续天数