MySQL实现三字段中匹配指定数字的总数统计需求
解决方案:统计每行匹配指定数字的总个数
原查询的问题在于,每个CASE语句采用了多分支WHEN逻辑——只要某一个数字匹配就返回1,且不会继续检查后续数字,因此无论该行匹配1个还是多个目标数字,结果都只会是1,无法实现累加计数。
要解决这个问题,需要将每个目标数字的匹配判断独立开来,分别统计每个数字的匹配情况后再求和,这样就能得到每行实际匹配的数字总数。修改后的SQL如下:
SELECT *, SUM( IF(FIND_IN_SET('67', numbers_line1) > 0, 1, 0) + IF(FIND_IN_SET('80', numbers_line1) > 0, 1, 0) + IF(FIND_IN_SET('47', numbers_line1) > 0, 1, 0) ) AS total_numbers_line_1, SUM( IF(FIND_IN_SET('67', numbers_line2) > 0, 1, 0) + IF(FIND_IN_SET('80', numbers_line2) > 0, 1, 0) + IF(FIND_IN_SET('47', numbers_line2) > 0, 1, 0) ) AS total_numbers_line_2, SUM( IF(FIND_IN_SET('67', numbers_line3) > 0, 1, 0) + IF(FIND_IN_SET('80', numbers_line3) > 0, 1, 0) + IF(FIND_IN_SET('47', numbers_line3) > 0, 1, 0) ) AS total_numbers_line_3 FROM cards WHERE id_bingo = '5bgd8moawmkh5' GROUP BY id_card HAVING total_numbers_line_1 > 0 OR total_numbers_line_2 > 0 OR total_numbers_line_3 > 0;
关键修改说明
- 把原来的单
CASE多分支结构,拆分为三个独立的IF判断:每个目标数字单独检查是否存在于对应行的字段中,存在则返回1,否则返回0。 - 将三个
IF的结果相加,再用SUM聚合(兼容单条或多条记录的分组场景),最终得到该行匹配目标数字的总个数。
如果更习惯用CASE语法,也可以写成以下等价形式:
SUM( (CASE WHEN FIND_IN_SET('67', numbers_line1) > 0 THEN 1 ELSE 0 END) + (CASE WHEN FIND_IN_SET('80', numbers_line1) > 0 THEN 1 ELSE 0 END) + (CASE WHEN FIND_IN_SET('47', numbers_line1) > 0 THEN 1 ELSE 0 END) ) AS total_numbers_line_1
内容的提问来源于stack exchange,提问作者Cloud5 Studios
相关产品推荐
相关产品推荐

