You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

运行结果说明

针对你给的示例数据,运行后会得到:

对比用户总绝对差值
32
23
43

计算过程验证:

  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:46:04