Mysql 对一行中的重复列值进行计数
我有一个非规范化的表,其中我必须计算其他列中相同值的数量。 我正在使用InfiniDB 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 |
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