如何在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_name、voucher_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




