You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在MySQL的LIKE查询中使用COUNT()函数?

在MySQL LIKE查询中结合COUNT()聚合函数的用法与示例分析

一、LIKE查询里用COUNT()的正确打开方式

咱们先理清楚,COUNT()是用来统计符合条件的行数,和LIKE模糊查询结合,主要有两种常见场景:

  • 场景1:统计匹配模糊条件的总记录数
    比如你想统计所有名称带“满减”的优惠券总数,直接用COUNT(*)配合WHERE里的LIKE就行,简单直接:

    SELECT COUNT(*) AS total_coupons
    FROM voucher_click_count
    WHERE voucher_name LIKE '%满减%';
    
  • 场景2:分组后统计每组的匹配数量
    要是你想按优惠券ID分组,统计每个优惠券被点击的次数,同时只保留名称/编码包含特定关键词的分组,这时候要结合GROUP BY,还要注意:筛选分组后的结果要用HAVING,不能用WHERE(WHERE管不了聚合后的结果)。举个例子:

    SELECT 
        voucher_id,
        COUNT(*) AS click_count
    FROM voucher_click_count
    WHERE voucher_name LIKE '%1%' -- 先筛选原始数据中名称带1的记录
    GROUP BY voucher_id
    HAVING click_count >= 3; -- 再筛选出点击次数≥3的优惠券
    

二、你的SQL代码问题拆解

先把你贴的代码放出来,咱们逐个揪问题:

SELECT 
    voucher_id,
    voucher_name,
    voucher_code,
    count(voucher_id)as counts
FROM  voucher_click_count 
WHERE 1   and 
      voucher_name LIKE '%1%'   
      OR voucher_code LIKE '%1%'   
      OR count LIKE '%1%'  
GROUP BY voucher_id   OR count LIKE '%1%'   
ORDER BY voucher_name DESC  
LIMIT 0 ,10

1. WHERE子句的逻辑优先级坑

MySQL里AND的优先级比OR高,所以你的条件会被解析成:(1 AND voucher_name LIKE '%1%') OR voucher_code LIKE '%1%' OR count LIKE '%1%'——这和你想要的“三个条件任意一个满足”完全不是一回事!如果要让三个OR条件平等,必须用括号把它们包起来:WHERE (voucher_name LIKE '%1%' OR voucher_code LIKE '%1%' OR count LIKE '%1%')。另外count是MySQL的关键字,作为字段名的话必须加反引号`count`,不然直接报错。

2. GROUP BY完全写错了

GROUP BY voucher_id OR count LIKE '%1%'这是语法逻辑双错误:GROUP BY后面应该跟字段名或者合法的表达式,你这里的OR会被当成布尔值(0或1),导致分组完全乱套。而且按照SQL标准,SELECT里的非聚合字段(比如voucher_namevoucher_code)必须出现在GROUP BY里,不然在MySQL严格模式下直接报错。

3. 聚合函数和字段名混淆

你写的count LIKE '%1%',如果count是表中的字段,必须加反引号;如果是想引用count(voucher_id)的结果,那WHERE里不能用聚合函数,得放到HAVING里。

修正后的参考代码

假设你的需求是:按优惠券ID分组,统计每个优惠券的点击次数,同时筛选出名称/编码/点击数字段包含'1'的记录,最后按名称降序取前10条,修正后的代码如下:

SELECT 
    voucher_id,
    voucher_name,
    voucher_code,
    COUNT(voucher_id) AS counts
FROM  voucher_click_count 
WHERE 
    voucher_name LIKE '%1%'   
    OR voucher_code LIKE '%1%'   
    OR `click_count` LIKE '%1%' -- 把字段名改成click_count,避免和关键字冲突
GROUP BY voucher_id, voucher_name, voucher_code -- 所有非聚合字段都加入GROUP BY
ORDER BY voucher_name DESC  
LIMIT 0, 10;

最后再划几个重点

  • 用LIKE+COUNT()时,WHERE管原始行筛选,HAVING管分组后的结果筛选,别搞混;
  • AND和OR一起用的时候,一定要加括号明确逻辑优先级,不然容易出意外;
  • 别用MySQL关键字当字段名,真要用的话必须加反引号;
  • GROUP BY里必须包含所有SELECT中的非聚合字段,这是SQL标准,别依赖MySQL的宽松模式。

内容的提问来源于stack exchange,提问作者Satish Kilari

火山引擎 最新活动