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
相关产品推荐
相关产品推荐

