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

如何将两条统计不同groupid的MySQL查询合并为单条查询

两条查询合并方案

核心采用条件聚合实现单查询拿到两组统计结果,性能优于两次独立查询:

$combinedQ = $db->query('
    SELECT 
        DATE_FORMAT(regtime, "%M") AS luna,
        COUNT(CASE WHEN groupid = 6 THEN id END) AS devizieri,
        COUNT(CASE WHEN groupid = 7 THEN id END) AS beneficiar
    FROM edev_useri 
    WHERE 
        groupid IN (6,7) 
        AND YEAR(regtime) = YEAR(CURRENT_DATE) 
    GROUP BY DATE_FORMAT(regtime, "%M") 
    ORDER BY MONTH(regtime) ASC
');

方案说明

  • 统计逻辑:COUNT统计时会忽略CASE WHEN未命中返回的NULL值,精准实现按groupid分别统计月度数量的效果,没有数据的月份对应统计值自动为0
  • 排序优化:原查询按月份字符串排序可能出现顺序错乱,改为按MONTH(regtime)排序完全符合时间先后逻辑
  • 结果遍历:每一行返回的字段包含月份、groupid=6的统计值devizieri、groupid=7的统计值beneficiar,直接适配图表展示的多序列数据要求,无需额外拼接两次查询的结果

如果你的原有业务逻辑需要保留两条查询的行结构,可以用UNION ALL方案:

$unionQ = $db->query('
    SELECT "devizieri" AS stat_type, DATE_FORMAT(regtime, "%M") AS luna, COUNT(id) AS stat_num 
    FROM edev_useri 
    WHERE groupid = 6 AND YEAR(regtime) = YEAR(CURRENT_DATE) 
    GROUP BY DATE_FORMAT(regtime, "%M")
    UNION ALL
    SELECT "beneficiar" AS stat_type, DATE_FORMAT(regtime, "%M") AS luna, COUNT(id) AS stat_num 
    FROM edev_useri 
    WHERE groupid = 7 AND YEAR(regtime) = YEAR(CURRENT_DATE) 
    GROUP BY DATE_FORMAT(regtime, "%M")
    ORDER BY MONTH(regtime) ASC, stat_type ASC
');

这个方案返回的每一行带stat_type字段区分统计项,你可以按类型筛选分别拿到原来两组查询的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:27:04