同表JOIN并忽略NULL值:合并同组数据的SQL实现问询
解决同表合并分组内非NULL字段的问题
咱们先明确你的核心需求:把hadap_game表中,同一userid、game、date_t、hdigit分组下的inside和outside字段合并,保留两个字段的非NULL值,去掉重复分组里的冗余行(比如前两行的xy游戏分组)。
方案一:用聚合函数分组合并(推荐)
这种方式不需要自连接,直接通过GROUP BY结合聚合函数提取每个分组里的非NULL值,性能更优:
SELECT MIN(id) AS id, -- 取分组内最小的id,匹配你期望的结果id userid, game, date_t, hdigit, MAX(inside) AS inside, -- 提取分组内非NULL的inside值 MAX(outside) AS outside -- 提取分组内非NULL的outside值 FROM hadap_game WHERE userid = :user -- 你的用户参数条件 GROUP BY userid, game, date_t, hdigit ORDER BY id;
为什么这个方案有效?
因为你的数据里,同一分组内inside和outside各自只会有一个非NULL值(另一个是NULL),MAX()函数会自动忽略NULL,只保留有效数值。对于hdigit不同的分组(比如xx游戏的hdigit=2和3),因为分组条件不同,会各自保留独立行,正好符合你的期望结果。
方案二:修正自连接写法
如果你坚持要用自连接,需要补充完整的连接条件,确保只关联同一分组的行,同时过滤掉无效的NULL匹配:
SELECT h.id, h.userid, h.game, h.date_t, h.hdigit, h.inside, COALESCE(h.outside, htwo.outside) AS outside FROM hadap_game AS h LEFT JOIN hadap_game AS htwo ON h.userid = htwo.userid AND h.game = htwo.game AND h.date_t = htwo.date_t AND h.hdigit = htwo.hdigit AND h.inside IS NOT NULL AND htwo.outside IS NOT NULL WHERE h.userid = :user GROUP BY h.id, h.userid, h.game, h.date_t, h.hdigit, h.inside, htwo.outside;
你原来的SQL问题点
你之前的自连接只写了部分条件,没有用ON指定分组关联的核心字段(game、date_t、hdigit),这会导致错误的交叉连接,无法正确匹配同一分组的行。
内容的提问来源于stack exchange,提问作者user8910784
相关产品推荐
相关产品推荐

