Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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_Sql_Infinidb - Fatal编程技术网

Mysql 对一行中的重复列值进行计数

Mysql 对一行中的重复列值进行计数,mysql,sql,infinidb,Mysql,Sql,Infinidb,我有一个非规范化的表,其中我必须计算其他列中相同值的数量。 我正在使用InfiniDB Mysql存储引擎 这是我的桌子: col1 | col2 | col3 ------------------ A | B | B A | B | C A | A | A 这就是我所期望的: col1Values | col2Values | col3Values ------------------------------------ 1 |

我有一个非规范化的表,其中我必须计算其他列中相同值的数量。 我正在使用InfiniDB Mysql存储引擎

这是我的桌子:

col1 | col2 | col3
------------------
A    | B    | B
A    | B    | C
A    | A    | A
这就是我所期望的:

col1Values | col2Values | col3Values
------------------------------------
    1      |     2      |      2     -- Because B is in Col2 and Col3
    1      |     1      |      1     
    3      |     3      |      3
有类似的吗

-- function count_values(needle, haystack1, ...haystackN)
select count_values(col1, col1, col2, col3) as col1values -- col1 is needle
    , count_values(col2, col1, col2, col3) as col2values -- col2 is needle
    , count_values(col3, col1, col2, col3) as col3values -- col3 is needle
from table
或者我错过了一些简单的方法来达到目的吗?:-)

提前谢谢

罗马人


假设表有一个键,您可以:

  • 打开桌子

  • 将未插入的数据集连接回原始数据集

  • 对于原始列中的每一列,对未插入的列进行匹配计数

  • 以下是如何实现上述功能:

    SELECT
      COUNT(t.col1 = s.col OR NULL) AS col1Values,
      COUNT(t.col2 = s.col OR NULL) AS col2Values,
      COUNT(t.col3 = s.col OR NULL) AS col3Values
    FROM atable t
      INNER JOIN (
        SELECT
          t.id,
          CASE colind
            WHEN 1 THEN t.col1
            WHEN 2 THEN t.col2
            WHEN 3 THEN t.col3
          END AS col
        FROM atable t
        CROSS JOIN (SELECT 1 AS colind UNION ALL SELECT 2 UNION ALL SELECT 3) x
      ) s ON t.id = s.id
    GROUP BY t.id
    ;
    

    子查询使用交叉联接取消对表的绑定。
    id
    列是一个键列。
    或NULL
    位在中进行了解释。

    我发现了一个不同的非常简单的解决方案:-)

    SELECT
      COUNT(t.col1 = s.col OR NULL) AS col1Values,
      COUNT(t.col2 = s.col OR NULL) AS col2Values,
      COUNT(t.col3 = s.col OR NULL) AS col3Values
    FROM atable t
      INNER JOIN (
        SELECT
          t.id,
          CASE colind
            WHEN 1 THEN t.col1
            WHEN 2 THEN t.col2
            WHEN 3 THEN t.col3
          END AS col
        FROM atable t
        CROSS JOIN (SELECT 1 AS colind UNION ALL SELECT 2 UNION ALL SELECT 3) x
      ) s ON t.id = s.id
    GROUP BY t.id
    ;
    
    select if(col1=col1,1,0) + if(col2=col1,1,0) + if(col3=col1,1,0) as col1values -- col1 is needle
    from table