You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:17:47