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

如何将两个MySQL SELECT查询结果合并为单个查询?

如何在MySQL中合并两个结果集为单个统一结果?

嘿,刚好能帮到你!你想要把两个分组查询的结果按日期和国家合并到同一张表里,这个需求用MySQL的JOIN就能轻松实现——因为你的两个结果集有完全匹配的分组键:日期(day_month_year)和国家(country),这正是我们用来关联的核心字段。

具体实现代码

我们可以把两个原始查询分别作为子查询,然后通过共同字段关联起来,最终得到你想要的合并结果:

SELECT 
    t1.day_month_year AS day,
    t1.country AS Country,
    t1.count AS Count,
    t1.MAIL AS Mail,
    t2.count_BUY AS Count_BUY
FROM
    (
        -- 第一个查询:获取总计数和独立邮箱数
        SELECT 
            DATE_FORMAT(db.prod_id.created_on, '%d-%m-%Y') as day_month_year, 
            db.country.country , 
            COUNT(*) as count , 
            COUNT(DISTINCT db.prod_id.email) AS MAIL 
        FROM db.prod_id 
        LEFT JOIN db.country ON db.prod_id.branch_id = db.country.id 
        WHERE db.prod_id.created_on > '2020-11-17' 
          AND (db.country.type = 1 OR db.country.type = 2) 
        GROUP BY day_month_year, db.country.country 
    ) t1
INNER JOIN
    (
        -- 第二个查询:获取在线购买计数
        SELECT 
            DATE_FORMAT(db.prod_id.created_on, '%d-%m-%Y') as day_month_year, 
            db.country.country, 
            COUNT(*) as count_BUY 
        FROM db.prod_id 
        LEFT JOIN db.prod_evaluations ON db.prod_id.id = db.prod_evaluations.id 
        LEFT JOIN db.country ON db.prod_id.branch_id = db.country.id 
        LEFT JOIN (
            SELECT prod_properties.prod_id, prod_properties.value 
            FROM prod_properties 
            WHERE prod_properties.property_id = 5
        ) as db3 ON db3.prod_id = db.prod_id.id 
        WHERE db.prod_id.created_on > '2020-11-17' 
          AND db3.value = 'online-buy' 
          AND db.prod_id.status_id <> 25 
        GROUP BY day_month_year, db.country.country 
    ) t2
ON t1.day_month_year = t2.day_month_year 
   AND t1.country = t2.country
ORDER BY t1.day_month_year, t1.country;

几个小优化和说明

  1. 日期格式化简化:我把你原来手动拼接日期的CONCAT(day(...),"-",month(...),"-",year(...))改成了DATE_FORMAT(db.prod_id.created_on, '%d-%m-%Y'),这样代码更简洁,也避免了重复拼接的冗余操作。
  2. COUNT函数优化:原来的count(concat(...))可以直接换成COUNT(*),因为分组后每一行对应一组数据,计数结果是完全一致的,这样性能更好。
  3. 关联方式选择:这里用了INNER JOIN,因为你的示例数据中两个结果集的日期和国家是完全匹配的。如果实际场景中可能存在某个日期+国家组合只在其中一个查询里出现的情况,可以把INNER JOIN改成LEFT JOIN,并且用COALESCE(t2.count_BUY, 0)来把NULL替换成0,保证结果更友好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:37:53