最近也是在写项目中碰到的这个问题,需要将两个SELECT查询结果组合起来进行分组排序,想到了用union方法,用TP的union操作根本无法完成复杂的union操作,于是搜罗了一下,先说一下union的用法,在说一下TP中如何实现复杂的union操作。
一、UNION 用法
一 UNION语法
SELECT ...
UNION[ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]
UNION用于把来自许多SELECT语句的结果组合到一个结果集合中。
列于每个SELECT语句的对应位置的被选择的列应具有相同的类型。(例如,被第一个语句选择的第一列应和被其它语句选择的第一列具有相同的类型。www.111cn.net)在第一个SELECT语句中被使用的列名称也被用于结果的列名称。
SELECT语句为常规的选择语句,但是受到如下的限定:
·只有最后一个SELECT语句可以使用INTO OUTFILE。
·HIGH_PRIORITY不能与作为UNION一部分的SELECT语句同时使用。如果您对第一个 SELECT指定了HIGH_PRIORITY,则不会起作用。如果您对其它后续的SELECT语句指定了HIGH_PRIORITY,则会产生语法错误。
如果您对UNION不使用关键词ALL,则所有返回的行都是唯一的,如同您已经对整个结果集合使用了DISTINCT。如果您指定了ALL,您会从所有用过的SELECT语句中得到所有匹配的行。
DISTINCT关键词是一个自选词,不起任何作用,但是根据SQL标准的要求,在语法中允许采用。(在MySQL中,DISTINCT代表一个共用体的默认工作性质。)
您可以在同一查询中混合UNION ALL和UNION DISTINCT。被混合的UNION类型按照这样的方式对待,即DISTINCT共用体覆盖位于其左边的所有ALL共用体。DISTINCT共用体可以使用UNION DISTINCT明确地生成,或使用UNION(后面不加DISTINCT或ALL关键词)隐含地生成。
如果您想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到最后一个的后面。以下例子同时使用了这两个子句:
代码如下 | |
(SELECT a FROM tbl_name WHERE a=10 AND B=1)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2)ORDER BY a LIMIT 10; (SELECT a FROM tbl_name WHERE a=10 AND B=1)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2)ORDER BY a LIMIT 10; |
这种ORDER BY不能使用包括表名称(也就是,采用tbl_name.col_name格式的名称)列引用。可以在第一个SELECT语句中提供一个列别名,并在ORDER BY中参阅别名,或使用列位置在ORDER BY中参阅列。(首选采用别名,因为不建议使用列位置。)
另外,如果带分类的一列有别名,则ORDER BY www.111cn.nEt子句必须引用别名,而不能引用列名称。以下语句中的第一个语句必须运行,但是第二个会运行失败,出现在'order clause'中有未知列'a'的错误:
代码如下 | |
(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b; (SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a; To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT。 |
为了对单个SELECT使用ORDER BY或LIMIT,应把子句放入圆括号中。圆括号包含了SELECT。
代码如下 | |
(SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10); |
二 实例扩展
union可以对同一个表的两次查询联合起来. 这样做的益处也非常明显, 比如在blog应用中, 可以利用一条sql语句实现置顶blog和普通blog的分页显示.
代码如下 | |
( SELECT * FROM `blog` WHERE top=1 ORDER BY created DESC ) UNION ( SELECT * FROM `blog` WHERE top = 0 ORDER BY created DESC ) LIMIT 2 , 3 |
注:union要求联合的两个表所要查找的数据列要一样多,如果一个表中没有另一个表的字段,可以用NULL代替
三,实例
UNION
代码如下 | |
select * from |
中的UNION
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:
代码如下 | |
select * from gc_dfys union select * from ls_jg_dfys |
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
MySQL中的UNION ALL
而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:
代码如下 | |
select * from gc_dfys union all select * from ls_jg_dfys |
解决mysql中union排序的问题 .
关于union双向排序(mysql)
群里的朋友问了一个mysql查询的问题
需求是这样的
论坛希望在显示帖子列表时侯前三条是点击量最多的,即按点击次数查询,
余下的按时间查询
实际就是两个union的排序都生效
Sql代码
代码如下 | |
(select * from (select * from table order by colnum desc) a); |
估计很多人会有这个需求。
代码如下 | |
SELECT *,1 as ord FROM `women` where status = 2 and title like '%2014%' or title like '%秋冬%' union (select *,2 as ord FROM `women` where status = 2 and keywords like '%2014%' or keywords like '%秋冬%') ORDER BY ord,id desc limit 0,15; |
相关推荐
在MySQL中,`UNION ALL` 用于合并多个`SELECT`语句的结果集,而这里的重点是如何在合并结果后进行排序。在给定的场景中,我们有一个文章数据表,其中文章的状态通过`PROMOTE_STATUS`字段表示,分别对应0(待发布)、...
本文将深入探讨这两种操作符的使用方法及其性能差异。 首先,`UNION` 操作符用于合并两个或多个`SELECT`语句的结果,并自动去除重复的行。这意味着,当你使用`UNION`时,最终返回的结果集中不会有重复的记录。例如...
- 当使用 `UNION` 或 `UNION ALL` 时,MySQL会自动对结果进行排序,除非你明确指定了 `ORDER BY` 子句。但是,`ORDER BY` 只能应用于整个 `UNION` 结果,而不能应用于单个 `SELECT` 语句。 - 如果没有指定 `ORDER BY...
然而,当你试图在 `UNION` 后直接使用 `ORDER BY` 对合并后的结果进行排序时,会出现错误,因为MySQL解析器期待的是一个单独的 `ORDER BY` 子句来处理整个合并后的结果集。以下是关于如何在MySQL中正确地同时使用 `...
在MySQL中,`UNION` 子句用于合并两个或多个`SELECT`语句的结果集,但是它并不直接支持在每个`SELECT`语句后直接跟`ORDER BY`子句来对合并后的结果进行排序。这是因为`UNION`操作会先进行数据合并,然后再去除重复的...
MySQL中的`UNION`和`UNION ALL`是两种用于合并多个查询结果集的方法,它们在处理数据并集时有着显著的区别。 1. **UNION**: `UNION` 操作符用于合并两个或更多`SELECT`语句的结果集,并自动去除重复行。在执行`...
在某些版本的MySQL中,可能需要使用LIMIT子句与子查询结合来实现类似的功能。 总之,使用UNION和ORDER BY时,应确保ORDER BY位于所有UNION操作之后,以对整个合并结果进行排序。对于限制返回的行数,可以使用...
这种方法可能导致额外的排序和去重步骤,但对特定情况可能更有利。 5. **NULL值与索引** 当`OR`条件涉及到可能为`NULL`的列时,需要注意。MySQL的B-Tree索引不包含`NULL`值,因此,索引可能无法用于包含`NULL`的...
7. **排序与索引**: - 使用`ORDER BY`进行排序时,如果有对应的索引,MySQL可以利用索引来加快排序速度。例如,`SELECT * FROM order WHERE status IN (0, 1) ORDER BY date DESC`,如果`date`有索引,那么排序将...
通过合理地使用EXPLAIN命令、优化SQL语句、索引的使用、排序和限制、union和union all的差异、ORDER BY RAND()的优化、in和exists的区分、分页方式的优化、分段查询等方法,我们可以提高SQL语句的性能,提高MySQL...
MySQL中的`EXPLAIN`命令是数据库管理员和开发者用于分析SQL查询执行计划的重要工具。通过`EXPLAIN`,我们可以了解MySQL如何解析和优化SELECT语句,从而更好地理解查询的执行过程,找出潜在的性能瓶颈,以及如何优化...
MySQL UNION 操作符是SQL语言中的一个重要组成部分,它允许用户将多个SELECT语句的结果合并成一个单一的结果集。这个操作符常用于当你需要从不同的数据源或者不同的查询条件中汇总数据时。在本教程中,我们将深入...
第1章MySQL架构与历史1 1.1MySQL逻辑架构1 1.1.1连接管理与安全性2 1.1.2优化与执行3 1.2并发控制3 1.2.1读写锁4 1.2.2锁粒度4 1.3事务6 1.3.1隔离级别8 1.3.2死锁9 1.3.3事务日志10 1.3.4MySQL中的事务...
LIKE子句用于模糊匹配,UNION用于合并两个或多个SELECT语句的结果,ORDER BY用于排序,GROUP BY用于分组,而JOIN操作则用于连接两个或更多表的数据。 此外,教程还涉及了NULL值的处理,正则表达式的使用,事务处理...
除了基本查询,书中还将涵盖更复杂的查询技术,如联接(JOINs)不同表的数据,使用子查询进行嵌套查询,以及处理集合操作(UNION, INTERSECT, EXCEPT)。这些技巧对于处理多表关联和复杂的数据分析至关重要。 此外...