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

MySQL中UNION未返回全部行与IN查询结果不符的问题求助

MySQL UNION语句未返回全部行的排查问题

问题描述

我遇到了一个棘手的问题:MySQL的UNION语句未能返回全部行。

当执行以下IN查询时:

SELECT `full_address` FROM `x_servers` WHERE `service_type` IN ('boost','testboost')

返回了51行数据;但执行以下UNION查询时:

(SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'boost') UNION (SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'testboost')

仅返回25行。

单独执行两个子查询时:

SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'boost'

返回31行,

SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'testboost'

返回20行。

服务器信息

  • Server: MySQL (Localhost via UNIX socket)
  • Server type: MySQL
  • Server version: 8.0.30-0ubuntu0.20.04.2 - (Ubuntu)

问题原因及解决方案

核心原因:UNION 默认去重

MySQL中UNION操作符的默认行为是合并结果集并自动剔除重复行,而IN查询会保留所有匹配的行(包括重复的full_address值)。

从数据统计来看:31+20=51,与IN查询的行数完全吻合;UNION返回25行,说明两个子查询的结果集中存在大量重复的full_address记录,这些重复项被UNION自动过滤了。

验证重复数据

可以通过以下查询确认去重后的总行数:

SELECT COUNT(DISTINCT `full_address`) FROM `x_servers` WHERE `service_type` IN ('boost','testboost');

该查询的结果应与UNION返回的行数一致(25行)。

解决方案

如果需要保留所有匹配行(包含重复的full_address),请使用UNION ALL替代UNION:

(SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'boost') UNION ALL (SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'testboost')

UNION ALL不会对结果集去重,直接合并两个子查询的所有行,返回行数将与IN查询一致(51行)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:45:25