mysql多结果集_MySQL多结果集合并union查询

本文介绍了一种自定义查询规则的方法,通过在数据库中保存查询规则并返回同一表中的结果字段。利用MySQL的UNION ALL指令,可以合并多个查询结果并标注其来源规则,适用于需要整合不同条件查询结果的场景。

需求:

查询规则自定义,由数据库保存,返回结果字段来自同一张表;

要实现多个规则查询条件符合的适配,最终将查询结果合并展示出来,并标注是哪个规则的结果;

Mysql例子

--合并重复行

select * from A

union

select * from B

--不合并重复行

select * from A

union all

select * from B

Select * From (select id,adddate,title,url from bArticle where ClassId=1 order by adddate desc limit 0,2) A

Union All

Select * From (select id,adddate,title,url from bArticle where ClassId=2 order by adddate desc limit 0,2) B

Union All

Select * From (select id,adddate,title,url from bArticle where ClassId=3 order by adddate desc limit 0,2) C

Union All

Select * From (select id,adddate,title,url from bArticle where ClassId=4 order by adddate desc limit 0,2) D

实践:

这里使用的是mysql默认的数据库mysql

766030c3f206ce5266ec912b8c0653e8.png

SELECT * FROM (SELECT *,(SELECT 'A' as A) tag FROM help_topic) A

UNION ALL

SELECT * FROM (SELECT *,(SELECT 'B' as A) tag FROM help_topic) B

UNION ALL

SELECT * FROM (SELECT *,(SELECT 'C' as A) tag FROM help_topic) C

UNION ALL

SELECT * FROM (SELECT *,(SELECT 'D' as A) tag FROM help_topic) D

效果图:

1d73d89a5be31ed15e9bb911dd2dfa34.png

e7c24331c5eb0ca4d618dec97792e1fd.png

大小: 49.3 KB

5cd1d10b7980ae87ab4ab4522e10ffcd.png

大小: 7.4 KB

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2016-03-30 16:16

浏览 882

分类:数据库

评论

<think>我们正在讨论的是MySQL中合结果集的方法。根据引用,主要使用UNIONUNION ALL操作符。 引用[1][2][3]都提到了UNIONUNION ALL,它们用于合个SELECT语句的结果集。 引用[3]特别指出:合时要求两个表对应的列数和数据类型必须相同。UNION会删除重复行,而UNION ALL则保留所有行(包括重复行),且不对结果自动排序。 引用[4]给出了一个使用UNION ALL合查询的例子。 引用[5]展示了一个使用UNION ALL合后再用DISTINCT去重的例子(但注意,这里是在外层使用DISTINCT,而不是用UNION,因为UNION本身会去重)。 因此,我们需要向用户解释: 1. UNIONUNION ALL 的基本用法和区别 2. 如何使用它们合结果集 3. 注意事项(列数、数据类型、重复处理等) 4. 实际示例 另外,用户之前的问题是关于GROUP BY的,但当前问题转向了合结果集(UNION),所以我们需要专注于当前问题。 根据引用,我们可以整理回答如下: </think>### MySQL 结果集合方法详解 在 MySQL 中合结果集主要通过 `UNION` 和 `UNION ALL` 操作符实现。这两种方法的核心区别在于 **是否保留重复记录** 和 **是否自动排序**。 --- #### 一、核心操作符对比 | **特性** | `UNION` | `UNION ALL` | |----------------|-----------------------------|----------------------------| | **重复记录** | 自动去重 | 保留所有记录(含重复) | | **排序** | 结果集默认按首列排序 | 不排序,保留原始顺序 | | **性能** | 较慢(需去重计算) | 更快(无额外计算) | | **语法** | `SELECT ... UNION SELECT` | `SELECT ... UNION ALL SELECT` | --- #### 二、具体使用方法 ##### 1. 基础合(相同列结构) ```sql -- 合两个表的结果(去重) SELECT name, age FROM employees UNION SELECT name, age FROM contractors; -- 合结果(保留重复) SELECT dept FROM office_A UNION ALL SELECT dept FROM office_B; ``` > **注意**:所有 `SELECT` 语句的列数、数据类型和顺序必须完全一致[^3]。 ##### 2. 多结果集 ```sql -- 合三个查询结果(含别名统一) SELECT product_id AS id, price FROM store_A UNION ALL SELECT goods_id, cost FROM store_B -- 列名不同需别名 UNION ALL SELECT item_code, sale_price FROM online_store; ``` ##### 3. 复杂合(嵌套去重) ```sql -- 先合再全局去重(引用[5]的优化方案) SELECT DISTINCT category_id FROM ( SELECT cat_id AS category_id FROM goods_A UNION ALL SELECT category_id FROM goods_B ) AS combined_data; ``` --- #### 三、使用场景对比 | **需求** | **推荐方法** | **示例** | |---------------------------|----------------|----------------------------------| | 需要精确去重 | `UNION` | 合用户ID去重 | | 追求性能/保留原始数据 | `UNION ALL` | 合日志表(需保留重复条目) | | 层级结果 | 嵌套查询 | 先分表聚合再合(如:销售报表) | --- #### 四、注意事项 1. **数据类型强制转换** 若列类型不一致(如 `VARCHAR` 与 `INT`),需显式转换: ```sql SELECT CAST(code AS CHAR) FROM tableA UNION SELECT name FROM tableB; ``` 2. **排序控制** `UNION` 默认排序,需自定义排序时在外层添加 `ORDER BY`: ```sql (SELECT name FROM A) UNION (SELECT name FROM B) ORDER BY name DESC; ``` 3. **性能陷阱** - 避免在 `UNION` 中使用 `SELECT *`(明确指定列) - 大数据集优先用 `UNION ALL` + 外层去重(如引用[5]方案) --- #### 五、实战示例 **需求**:合两个分公司的销售数据(保留重复),计算总销售额: ```sql SELECT 'Total' AS source, SUM(amount) AS total_amount FROM ( SELECT amount FROM branch_A_sales UNION ALL SELECT amount FROM branch_B_sales ) AS combined; ``` 输出: ``` +--------+--------------+ | source | total_amount | +--------+--------------+ | Total | 1250000.00 | +--------+--------------+ ``` > **关键原则**: > - 去重需求 → `UNION` > - 性能优先 → `UNION ALL` + 外层处理[^1][^3] > - 复杂合 → 嵌套查询分层处理[^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值