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

