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

MySQL多表连接、去重计数及平均值计算技术求助

解决MySQL多表合并、去重计数与平均值计算问题

没问题,我来帮你搞定这个MySQL查询需求!结合你给出的表结构和需求,咱们一步步拆解实现:

1. 合并多张同结构表

因为你的table_a和table_b结构完全一致,需要把它们的数据集合并到一起,这里用UNION ALL是最优选择(比UNION更高效,因为不会自动去重,而你的两张表id不重复,不需要额外去重操作):

SELECT id, date, value FROM table_a
UNION ALL
SELECT id, date, value FROM table_b

这条语句会把两张表的所有行合并成一个统一的结果集,后续的统计操作都基于这个合并后的数据集。

2. 对id的出现次数进行Distinct去重计数

这里分两种常见场景,你可以根据实际需求选择:

  • 场景1:统计不同id的总数量(即去重后的id个数)
SELECT COUNT(DISTINCT id) AS distinct_id_count
FROM (
    SELECT id FROM table_a
    UNION ALL
    SELECT id FROM table_b
) AS combined_tables

针对你的示例数据,这个查询会返回2,因为存在id=1和id=2两个不同的id。

  • 场景2:统计每个id的去重后记录数(按date去重)
    如果你的需求是统计每个id下不重复的date记录数(比如同一个id可能存在重复date的记录,需要去重统计),可以这样写:
SELECT id, COUNT(DISTINCT date) AS unique_date_count_per_id
FROM (
    SELECT id, date FROM table_a
    UNION ALL
    SELECT id, date FROM table_b
) AS combined_tables
GROUP BY id

针对你的示例数据,每个id的date都是唯一的,所以会返回:

idunique_date_count_per_id
14
24

3. 计算平均值

同样分两种常用场景:

  • 场景1:计算所有value的整体平均值
    基于合并后的所有value计算全局平均值:
SELECT AVG(value) AS overall_value_avg
FROM (
    SELECT value FROM table_a
    UNION ALL
    SELECT value FROM table_b
) AS combined_tables

针对你的示例数据,计算结果是(8+1+1+2+10+5+10+6)/8 = 43/8 = 5.375。

  • 场景2:先算每个id的value平均值,再求这些平均值的整体平均
    如果需要先按id分组计算单id的value平均值,再对这些平均值求整体平均,可以这样写:
SELECT AVG(id_avg) AS avg_of_id_avgs
FROM (
    SELECT id, AVG(value) AS id_avg
    FROM (
        SELECT id, value FROM table_a
        UNION ALL
        SELECT id, value FROM table_b
    ) AS combined_tables
    GROUP BY id
) AS id_avg_results

针对你的示例数据,id=1的平均值是(8+1+1+2)/4=3,id=2的平均值是(10+5+10+6)/4=7.75,最终结果是(3+7.75)/2=5.375。

组合需求:一次性获取所有统计结果

如果你希望在一个查询里同时得到distinct id计数、整体value平均值、每个id的细分统计,可以用子查询组合实现:

SELECT
    (SELECT COUNT(DISTINCT id) FROM (SELECT id FROM table_a UNION ALL SELECT id FROM table_b) AS t) AS distinct_id_count,
    (SELECT AVG(value) FROM (SELECT value FROM table_a UNION ALL SELECT value FROM table_b) AS t) AS overall_value_avg,
    id,
    COUNT(DISTINCT date) AS unique_date_count_per_id,
    AVG(value) AS id_value_avg
FROM (
    SELECT id, date, value FROM table_a
    UNION ALL
    SELECT id, date, value FROM table_b
) AS combined_tables
GROUP BY id

这样就能一次性满足你所有的需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:50:52