MySQL中使用自定义变量 编写偷懒的UNION示例

以下是对MySQL中使用自定义变量,编写一个UNION的示例进行了详细的介绍,需要的朋友可以过来参考下
 

(参考自<<高性能MySQL>>)
假设有这样的需求:写一个UNION查询,其第一个子查询作为分支先执行,如果找到了匹配的行,则不再执行第二个分支的查询。

一般来说,我们可以写出这样的UNION查询:

复制代码 代码如下:

select id from users where id=123456
union all
select id from users_archived where id = 123456;

此查询可以正常运行,但是无论在users表中是否找到记录,都会到users_archived表中扫描一次;因此可能也会返回重复的记录。为了减少这种情况下不必要的开销,SQL语句可以写成这样:

复制代码 代码如下:

SELECT GREATEST(@found := -1, id) AS id, 'users' AS which_tbl
FROM users WHERE id  = 1
UNION ALL
    SELECT id, 'users_archived'
    FROM users_archived WHERE id = 1 and @found IS NULL
UNION ALL
    SELECT 1, 'reset' FROM DUAL WHERE (@found := NULL) IS NOT NLL;

上 面的查询用到了自定义变量@found,通过在结果列中做一次赋值并且放在GREATEST函数中,以避免返回额外的数据。如果第一个分支查询结果集为 NULL,那@found自然也还是NULL,因此会执行第二个分支查询。另外,为了不影响后面的遍历结果,在查询的末尾将@found重置为NULL。

另外, 返回的第二列数据是为了说明这条记录是在users表还是在users_archived表中查询得到的。

时间: 2024-10-31 02:34:12

MySQL中使用自定义变量 编写偷懒的UNION示例的相关文章

MySQL中使用自定义变量 编写偷懒的UNION示例_Mysql

(参考自<<高性能MySQL>>) 假设有这样的需求:写一个UNION查询,其第一个子查询作为分支先执行,如果找到了匹配的行,则不再执行第二个分支的查询. 一般来说,我们可以写出这样的UNION查询: 复制代码 代码如下: select id from users where id=123456union allselect id from users_archived where id = 123456; 此查询可以正常运行,但是无论在users表中是否找到记录,都会到users

在服务器的mysql中创建自定义函数出错

问题描述 在服务器的mysql中创建自定义函数出错 我的一台机器,连接服务器上mysql,创建自定义函数报错[Err] 1418 - This function has none of DETERMINISTIC NO SQL or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators

mysql中如何使用变量向插入数据

问题描述 mysql中如何使用变量向插入数据 String sql=""INSERT INTO staff(nameAGE)""+""VALUES('na'2)""; 这样写的话只是插入字面值,可我想插入的是一个变量里面所拥有的值,求大神 解决方案 String na=""demo"";String sql=""INSERT INTO staff(nameAGE)&q

MySQL中给自定义的字段查询结果添加排名的方法_Mysql

 我正在用 MySQL 客户端的时候,突然想到如果可以给查询结果添加排名该多好啊,然后就找到了一个简单的解决办法. 下面是一个示例表的数据:  然后我们要根据 Roll_No 字段进行排序并给出排名,我们首先必须定义一个初始值为0的变量,然后在查询结果中使用这个变量. 如下面的代码:   SET @counter=0; SELECT @counter:=@counter+1 AS Rank,LastName,Roll_no as Roll FROM Students ORDER BY Roll_

详解JavaScript中的自定义事件编写_基础知识

我们可以自定义事件来实现更灵活的开发,事件用好了可以是一件很强大的工具,基于事件的开发有很多优势(后面介绍). 与自定义事件的函数有 Event.CustomEvent 和 dispatchEvent. 直接自定义事件,使用 Event 构造函数: var event = new Event('build'); // Listen for the event. elem.addEventListener('build', function (e) { ... }, false); // Disp

PHP模板引擎Smarty自定义变量调解器用法_php实例

本文实例讲述了PHP模板引擎Smarty自定义变量调解器用法.分享给大家供大家参考,具体如下: 在 PHP 中,有很多处理文本的函数,您可以把要处理的文本通过函数处理之后,再调用 Smarty 模板引擎中的 assign() 赋值给变量,分配到模板中进行显示. Smarty 中的变量调解器和 PHP 中处理文本的函数相似,不过语法不相同,在 Smarty 中,是通过 "|" 后面直接跟调解器函数名,如果有参数,得加在 ":" 后面,多个参数的话,累加即可. 格式:{

magento 1.4 -- 自定义变量(Custom Variables)使用初探

在CMS中使用的变量(Variables)在1.3时代就已经存在,只不过那时候只有少数几个,而且使用时需要自己手写.比如很常用的{{store url=""}}和{{skin url=""}},分别代表网站根url和当前使用模板的文件夹目录. 到了Magento1.4,后台引入了强大的编辑器和自定义变量,变量的使用更加方便而且可以在自带的基础上自己添加新变量了. 首先看下编辑器,打开一个CMS的内容页,编辑器里第一行第一个图标就是插入变量(Insert Variab

MySQL中Procedure事务编写基础笔记

原文:MySQL中Procedure事务编写基础笔记 目录: 一.PROCEDURE: 二.CREATE PROCEDURE基本语法: 三.PROCEDURE小进阶   3.1.基本的DECLARE语句;   3.2.声明HANDLER句柄;   3.3.声明CURSOR游标;   3.4.循环语句; 四.顺带提一下触发器TRIGGER 一.PROCEDURE: PROCEDURE,事务,一个存储过程,实际上就是在服务器端直接在数据库中编写一段代码作运算,在服务器端进行高效的运算,运算结果直接返

如何将mysql中读取的数据赋值到一个jsp的变量中

问题描述 如何将mysql中读取的数据赋值到一个jsp的变量中 我希望将更新的数据库中的数据赋值到一个jsp变量中然后传输到jsp内部的js程序中,请问怎么才能 把数据库中的值赋给一个jsp变量中. 解决方案 request.setCharacterEncoding("utf-8"); Class.forName("com.mysql.jdbc.Driver"); Connection conn= DriverManager.getConnection("