MySQL多列总绝对差值排序问题求助
如何按各列总绝对差值对MySQL表排序?
嘿,我来帮你搞定这个需求!你想要的是选定一个基准用户,计算它和其他用户所有an列的绝对差值总和,然后按这个总和从小到大排列其他用户,对吧?结合你给的示例数据,我给你整理了具体的实现方案。
首先假设你的表名叫user_scores,我们可以用自连接的方式来实现——把表和自身关联,一边作为基准用户,另一边作为对比用户,然后计算每对用户的差值总和,最后排序。
针对单个基准用户的查询(比如User1)
直接用这条SQL就能得到你要的结果:
SELECT u2.User AS 对比用户, ABS(u1.an1 - u2.an1) + ABS(u1.an2 - u2.an2) + ABS(u1.an3 - u2.an3) AS 总绝对差值 FROM user_scores u1 JOIN user_scores u2 ON u1.User != u2.User WHERE u1.User = 1 -- 这里指定基准用户为User1 ORDER BY 总绝对差值 ASC;
运行结果说明
针对你给的示例数据,运行后会得到:
| 对比用户 | 总绝对差值 |
|---|---|
| 3 | 2 |
| 2 | 3 |
| 4 | 3 |
计算过程验证:
- User1 vs User3:|1-2| + |4-3| + |3-4| = 1+1+1 = 2
- User1 vs User2:|1-1| + |4-5| + |3-5| = 0+1+2 = 3
- User1 vs User4:|1-2| + |4-4| + |3-1| = 1+0+2 = 3
完全符合你想要的排序逻辑~
通用版:查看所有用户的对比结果
如果想一次性看到每个用户和其他用户的差值排序,可以用这条语句:
SELECT u1.User AS 基准用户, u2.User AS 对比用户, ABS(u1.an1 - u2.an1) + ABS(u1.an2 - u2.an2) + ABS(u1.an3 - u2.an3) AS 总绝对差值 FROM user_scores u1 JOIN user_scores u2 ON u1.User != u2.User ORDER BY u1.User, 总绝对差值 ASC;
这样会按基准用户分组,每个组内的对比用户按总差值从小到大排列。
小提示
- 如果后续新增了
an4、an5这类列,只需要在差值计算部分继续追加ABS(u1.anX - u2.anX)就行,非常灵活。 - 建议给
User列加个唯一索引,这样自连接的查询效率会更高哦。
内容的提问来源于stack exchange,提问作者George Costanza
相关产品推荐
相关产品推荐

