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

MySQL使用CASE按条件求和icat_id对应category_count不生效求助

问题根因

你当前的查询按icat_id字段分组,444和448会生成两行独立的统计结果,你写的CASE语句仅能统计单行内符合条件的记录数,无法实现跨行合并统计的需求。

解决方案

先对icat_id做映射转换,将448的所有记录映射到444分组下,其他分类ID保持原值,再按映射后的ID分组统计即可实现需求。

修正后的查询语句

SELECT 
  MAX(CASE WHEN c.icat_id = 444 THEN c.vcategory ELSE c.vcategory END) AS vcategory,
  IF(c.icat_id = 448, 444, c.icat_id) AS icat_id,
  COUNT(DISTINCT product_cat_rel_1.iprod_id) AS category_count,
  UPPER(REGEXP_REPLACE(CONCAT(' ', MAX(CASE WHEN c.icat_id = 444 THEN c.vcategory ELSE c.vcategory END)), ' (.)[^ ]+', '\\1')) AS category_name
FROM product 
INNER JOIN product_cat_rel_1 ON product_cat_rel_1.iprod_id = product.iprod_id 
INNER JOIN product_price ON product_price.iprod_id = product.iprod_id 
INNER JOIN category as c ON c.icat_id = product_cat_rel_1.icat_id 
WHERE product.estatus='1' 
AND product_cat_rel_1.icat_id in (444,448,450,454,471,549,592,741,765,782) 
GROUP BY IF(c.icat_id = 448, 444, c.icat_id)

改动说明

  • 新增IF(c.icat_id = 448, 444, c.icat_id)做ID映射,将448的所有记录归到444的分组中
  • 分组字段替换为上述映射后的ID,保证444和448的统计值合并计算
  • 分类名称相关字段使用聚合函数包裹,适配MySQL的ONLY_FULL_GROUP_BY模式,避免分组语法报错

运行上述查询后,icat_id为444的category_count值就是444本身的统计值加上448的统计值,其他分类ID的统计结果保持不变。

内容的提问来源于stack exchange,提问作者Abid Hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:18:04