如何在MySQL非规范化表的多列中统计指定值出现次数
非规范化MySQL表中多列值的出现次数统计
当前查询的不足
- 原查询仅统计包含'1'的行数:只要某一行的任意一个目标列存在'1',就会被计数1次,完全忽略同一行中'1'出现多次的情况,无法得到所有列里'1'的总出现次数。
- 存在隐式类型转换风险:如果
column 1等列是整数类型,用字符串'1'匹配会触发MySQL的隐式类型转换,可能降低查询性能,甚至出现不符合预期的匹配结果。
统计总出现次数的方法
无需修改表结构的前提下,可以通过SUM()函数结合列值判断来实现:
针对字符串类型列的查询
SELECT SUM( (`column 1` = '1') + (`column 2` = '1') + (`column 3` = '1') + (`column 4` = '1') ) AS total_occurrences FROM persons WHERE person_MyId = '14';
针对整数类型列的查询
如果目标列存储的是整数,直接用数值1匹配,避免类型转换问题:
SELECT SUM( (`column 1` = 1) + (`column 2` = 1) + (`column 3` = 1) + (`column 4` = 1) ) AS total_occurrences FROM persons WHERE person_MyId = '14';
原理说明
MySQL中布尔表达式的计算结果为1(条件成立)或0(条件不成立)。将每个列的匹配结果相加,就能得到单一行中'1'的出现次数;再通过SUM()函数累加所有符合person_MyId='14'的行的结果,最终得到所有目标列中'1'的总出现次数。
内容的提问来源于stack exchange,提问作者d-comet
相关产品推荐
相关产品推荐

