Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在无法进行数据引用的情况下,计算每列中的差异数?_Mysql_Count_Sum - Fatal编程技术网

Mysql 在无法进行数据引用的情况下,计算每列中的差异数?

Mysql 在无法进行数据引用的情况下,计算每列中的差异数?,mysql,count,sum,Mysql,Count,Sum,我需要计算一组已知数据之间差异的总和。php中的等价物是 countarray_diff_assoc$array1。Mysql可以做到这一点吗?我有一组数据要在表中的字段列中相互比较 我要比较的数据是A:3、B:6、C:4列 测试表为: ID columnA columnB columnC 1 2 6 1 2 6 1 3 3

我需要计算一组已知数据之间差异的总和。php中的等价物是 countarray_diff_assoc$array1。Mysql可以做到这一点吗?我有一组数据要在表中的字段列中相互比较

我要比较的数据是A:3、B:6、C:4列

测试表为:

   ID       columnA     columnB    columnC
   1           2           6         1
   2           6           1         3
   3           3           6         4
预期结果:

 ID     numbersofdifferences
  3            0
  1            2
  2            3
谢谢你的帮助,
Jessica

没有内置函数来执行类似的操作,但您可以手动执行

select
    id,
    case columnA when $columnA then 1 else 0 end +
      case columnB when $columnB then 1 else 0 end +
      case columnC when $columnC then 1 else 0 end differences
  from
    myTable
但如果你想让它们有序排列,你就需要一个子选择

select * from 
  (
    select
        id,
        case columnA when $columnA then 1 else 0 end +
          case columnB when $columnB then 1 else 0 end +
          case columnC when $columnC then 1 else 0 end differences
      from
        myTable
  ) sqlRequiresNameHere
  order by differences

这不一定是最干净的,但您可以使用带有CASE表达式的聚合函数:

select id,
    sum(case when columna = 3 then 0 else 1 end) +
    sum(case when columnb = 6 then 0 else 1 end) +
    sum(case when columnc = 4 then 0 else 1 end) TotalDiff
from yourtable
group by id;

编辑,这也可以在没有聚合函数的情况下完成:

select id,
    (case when columna = 3 then 0 else 1 end) +
    (case when columnb = 6 then 0 else 1 end) +
    (case when columnc = 4 then 0 else 1 end) TotalDiff
from yourtable;

请参见

heh,我的方法与此完全相同。不过,我认为您不需要聚合函数。@McKay您是对的,我添加了一个没有聚合的版本。使用聚合将允许跨多行使用值。OP没有指定id是否是唯一的。是的,如果他需要跨id聚合,那么总和是必需的。很难确定OP想要什么,因为PHP函数并没有完全按照他要求的做。非常感谢你们的帮助,它似乎工作得很好!我有25个字段要比较:,所以我希望这种方式不会消耗太多资源。。?!我对你的答案没有足够的评价:你不需要用PHP中的array_diff_assoc比较两个表吗?在这种情况下,这不适用于您所描述的输出,因为表的大小相差很大?更多详细信息,我需要在这个结果中添加不同的值,您知道如何计算STYLE+PROF+TotalDiff之和吗。我有这样的想法:选择一些东西,abs 100-10作为风格,abs20-80作为教授,当prof_extend.b=1,然后0 else 1 end+当prof_extend.c=1,然后0 else 1 end+当prof_extend.d=5,然后0 else 1 end+当prof_extend.e=1,然后0 else 1 end+当prof_extend.v=3,然后0 else 1 end+当prof_extend.w=4,然后0 else 1 end+当prof_extendTotalDiff@jess如果你还有其他问题,那么你应该问一个新的问题,不要用新的要求更新这个问题。@jess你的更多细节评论让这成为另一个问题。