分类 日常 下的文章

相关官网教程以及下载地址:

安装后遇到表单页面无法访问,目前网上没找到相关解决教程,特把解决过程记录于此。

1.错误一 Declaration of BActiveForm::checkBox() should be compatible with
CActiveForm::checkBox($model, $attribute, $htmlOptions = Array)

解决方法:

1.修改 protected/extensions/bootstrap-theme/widgets/BActiveForm.php 的 234行

点击(此处)折叠或打开



publicfunction checkBox(CModel $model,$attribute,$htmlOptions=array()){

点击(此处)折叠或打开



publicfunctioncheckBox($model,$attribute,$htmlOptions=array()){

2.下面一个函数同理

点击(此处)折叠或打开



publicfunction labelEx(CModel $model,$attribute,$htmlOptions=array())

点击(此处)折叠或打开



publicfunction labelEx($model,$attribute,$htmlOptions=array())

错误二:Declaration of BHtml::linkButton() should be compatible with
CHtml::linkButton($label = 'submit', $htmlOptions = Array)

修改:protected/extensions/bootstrap-theme/helpers/BHtml.php 199行

点击(此处)折叠或打开



publicstatic function linkButton($label,$url='#',$htmlOptions=array()){
改为下面
publicstatic function linkButton($label='submit',$htmlOptions=array()){


页面成功显示:

一、看似偶然的东西实际是必然会发生的

我大学时候在图书馆翻过一本很破旧的书,讲生物理论的,主要内容就是探讨生命的产生是偶然还是必然。里面很多亚里士多德都看不懂的公式计算什么的,还有模拟原始地球环境出现了有机物的实验什么的
。总之,书论述的观点是:“在当时的地球环境下,生命的产生是必然的!”
无数次机会的偶然条件、无数次化合物的相遇反应等必定会产生有机物,再有N多偶然,有机物必然形成了有机体……

这种理论类似于,你是个过马路非常小心的人,且你万寿无疆,除了怕被汽车撞。给你100万年的寿命,你最后必然还是被车撞死。

如果以这种理论来看jQuery的出现,结论也应该是必然的

二、需求、动力、发展、事物产生与jQuery的诞生

一个成熟的东西显然不是一口气就出来的,所谓“一铲子挖不了一口井”,我想jQuery的原作者再天才,也是循序渐进过来的,如何个循序渐进法,我想,很有可能就是需求驱动而产生的,好比上图刀削面机器人,据说现在已经第八代了!

**
1. gelElementById太长了**
页面上有个按钮,还有个图片,我想点击按钮图片隐藏,如下HTML:



点击我
![](xxx.jpg)

于是,我的脚本可能就这样:



var button = document.getElementById("button")
    , image = document.getElementById("image")

button.onclick = function() {
    image.style.display = "none";
};

有何问题?人几乎都是天生的“懒惰者”,document.getElementById名称长且重复出现,好像到了公司发现卡没带又回家重新拿卡的感觉,我希望越简单越好。恩,
我很喜欢钱,$这个符号我很喜欢,我打算改造一番,简化我的工作:



var $ = function(id) {
    return document.getElementById(id);
};$("button").onclick = function() { $("image").style.display = "none";
};

这里的$()就是最简单的包装器,只是返回的是原生的DOM对象。

2. 我需要一个简洁的暗号,就像“芝麻开门”
后来页面复杂了,点击一个按钮,有2张图片要隐藏。



$("button").onclick = function() {
    $("image1").style.display = "none";
    $("image2").style.display = "none";
};

好像又看见长长的重复的东西,xxx.style.display = "none",
为什么每次开门都要从包里找到钥匙、对准插口插进去、还要左扭扭右扭扭呢?一次还好,天天经常老是这样怎受得了。设想,要是有个芝麻开门的暗号就好了,“open开”,声音识别,门自动开了,多省心。

这里每次隐藏都要xxx.style.display = "none",
比每天拿钥匙开门还要烦,我希望有一个快捷的方式,例如,“hide隐”,语句识别,元素自动隐藏,多省心。

就是要变成下面的效果:



$("button").onclick = function() {
    $("image1").hide();
    $("image2").hide();
};

**
3. 如何识别“芝麻开门”的暗号**
$("image1")本质是个DOM元素,$("image1").hide()也就是在DOM元素上扩展一个hide方法,调用即隐藏。

哦,扩展,立马想到了JS中的prototype原型。//zxx: 老板,现在满大街什么菜最便宜。老板:原型啊,都泛滥了!



HTMLElement.prototype.hide = function() {
    this.style.display = "none";
};

上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-
hide.html)应该不会被人看到吧……

虽然在身体上钻了个窟窿插进入了一个方法,毕竟浏览器有有效果啊,切肤之痛就不算什么了。但是,我们是在泱泱天朝,很多IE6~IE8老顽固,这些老东西不认识HTMLElement,对于HTMLElement自残扩展之法根本理解不了,而这些老家伙掌管了半壁江山。唉,面对现实,元素直接扩展是行不通了。

因此,由于兼容性,我们需要想其他扩展方法。

**
4. 条条大路通罗马,此处不留爷,自有留爷处**
虽IE6~IE8不识HTMLElement原型扩展,但是,Function的原型扩展其认识啊。管不管用,暂时不得而知,先随便搞个简单的试试呗~



var F = function() {};
F.prototype.hide = function() {
    this?.style.display = "none";
};

new F().hide(); // 这个实现隐藏?

本文至少还有一半的内容,但是,全文的最难点就在这里的,对new F()的认识和理解。

上面的代码,new F()您可以看做是this?.style这里的this. 您可能会跳起来抢答道:“那new F()的return值 =
DOM元素不就完事OK啦!—— this.style.hide = new F().style.hide = DOM.style.hide”!

只要new表达式之后的constructor返回(return)一个引用对象(数组,对象,函数等),都将覆盖new创建的匿名对象,如果返回(return)一个原始类型(无return时其实为return原始类型undefined),那么就返回new创建的匿名对象。

上面的引用来自。什么意思呢?说白了就是,new
F()如果没有返回值(Undefined类型),或返回值是5种基本型(Undefined类型、Null类型、Boolean类型、Number类型、String类型)之一,则new
F()我们可以看成是原型扩展方法中的this; 如果返回是是数组啊、对象啊什么的,则返回值就是这些对象本身,此时new F() ≠ this。

举例说明:



var F = function(id) {
    return document.getElementById(id);
};

new F("image1") == document.getElementById("image1"); // true 说明看上去返回DOM对象,实际确实就是DOM对象


var F = function(id) {
    return id;
};

new F("image1") == "image1"; // false 说明看上去返回字符串值,实际并不是字符串

回到上面天真的想法。要想使用prototype.hide方法中的this, 偶们就不能让F函数有乱七八糟的返回值。

因此,new F()直接返回DOM是不可取的,但我们可以借助this间接调用。比方说:



var F = function(id) { this.element = document.getElementById(id);
};
F.prototype.hide = function() { this.element.style.display = "none";
};

new F("image").hide(); // 看你还不隐藏

上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-
hide2.html)应该不会被人看到吧……

**
5. 我不喜欢太暴露**
F()中的this.element实际上将element这个属性直接暴露在了new F("image")上!



new F("image").hasOwnProperty("element"); // true


太暴露了,我不喜欢~~

如何隐藏?代码如下:



var F = function(id) {
    return this.getElementById(id);
};
F.prototype.getElementById = function(id) { this.element = document.getElementById(id);
    return this;
};
F.prototype.hide = function() {
    this.element.style.display = "none";
};

new F("image").hide(); // 看你还不隐藏

元素获取方法放在prototype上,通过F()执行。你可能会奇怪了,你刚明明说“new
F()直接返回DOM是不可取的”,怎么现在又有return呢?大家务必擦亮眼睛,F.prototype.getElementById的返回值是this,也就是new
F()的返回值是this. 形象点就是new F("image")出了一拳,又反弹到自己脸上了。

于是乎,现在就没有直接暴露的API了。

上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-
hide3.html)应该不会被人看到吧……

**
6. 我不喜欢new, 我喜欢$**
new F("image")这种写法我好不喜欢,我喜欢$, 我就是喜欢$, 我要换掉。

好吧,把new什么什么藏在$方法中把~



var $ = function(id) {
    return new F(id);
};

于是,上面的图片隐藏的直接执行代码就是:



$("image").hide();

上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-
hide4.html)应该不会被人看到吧……

IE6浏览器也是支持的哦!是不是已经有些jQuery的样子啦!

**
7. 你怎么就一种姿势啊,人家都腻了诶**
循序渐进到现在,都是拿id来举例的,实际应用,我们可能要使用类名啊,标签名啊什么的,现在,为了接下来的继续,有必要支持多个“姿势”。

在IE8+浏览器中,我们有选择器API,document.querySelector与document.querySelectorAll,前者返回唯一Node,后者为NodeList集合。大统一起见,我们使用后者。于是,就有:



var F = function(selector, context) {
    return this.getNodeList(selector, context);
};
F.prototype.getNodeList = function(selector, context) {
    context = context || document;
    this.element = context.querySelectorAll(selector);
    return this;
};

var $ = function(selector, context) {
    return new F(selector, context);
};

此时,我们就可以使用各种选择器了,例如,$("body #image"), this.element就是选择的元素们。

**
8. IE6/IE7肿么办?**
IE6/IE7不认识querySelectorAll,咋办?

jQuery就使用了一个比较强大的选择器框架-Sizzle.
知道就好,重在演示原理,因此,下面还是使用原生的选择器API示意,故demo效果需要IE8+浏览器下查看。

**
8. 遍历是个麻烦事**
this.element此时类型是NodeList, 因此,直接this.element.style.xxx的做法一定是报错,看来有必要循环下:



F.prototype.hide = function() {
    var i=0, length = this.element.length;
    for (; i



    于是乎:






$("img").hide(); // 页面所有图片都隐藏啦!

上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-
hide5.html)应该不会被人看到吧……

单纯一个hide方法还可以应付,再来个show方法,岂不是还要循环遍历一次,岂不是要烦死~

因此,急需一个遍历包装器元素的方法,姑且叫做each吧~

于是有:



F.prototype.each = function(fn) {
    var i=0, length = this.element.length;
    for (; i.each(function() {
       this.style.display = "none";
    });
};

$("img").hide(); // 页面所有图片都隐藏啦!

上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-
hide6.html)应该不会被人看到吧……

**
9. 我不喜欢this.element, 可以去掉吗?**
现在包装器对象结构类似这样:



F.prototype = {
    element: [NodeList],
    each: function() {},
    hide: function() {}
}

element看上去好碍眼,就不能去掉吗?可以啊,宝贝,NodeList是个类数组结构,我们把它以数值索引形式分配到对象中就好啦!一来去除冗余element属性,二来让原型对象成为类数组结构,可以有一些特殊的功能。

于是,F.prototype.getNodeList需要换一个名字了,比方说初始化init, 于是有:



F.prototype.init = function(selector, context) {
    var nodeList = (context || document).querySelectorAll(selector); this.length = nodeList.length;
    for (var i=0; ithis[i] = nodeList[i];    
    }
    return this;
};

此时,each方法中,就没有烦人碍眼的this.element[i]出现了,而是直接的this[i].



F.prototype.each = function(fn) {
    var i=0, length = this.length;
    for (; ithis[i], i, this[i]);
    }
    return this;
};

我们也可以直接使用索引访问包装器中的DOM元素。例如:$("img")[0]就是第一张图片啦!

上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-
hide7.html)应该不会被人看到吧……

**
10. 我是完美主义者,我特不喜欢F名称,可以换掉吗?**
F这个名称从头到尾出现,我好不喜欢的来,我要换成$, 我就是要换成$符号……

这个……$已经用了啊,再用冲突的吧。再说,你又不是狐后,耍无赖也没用啊……

好吧,想想其他办法吧。一步一步来,那我把所有的F换成$.fn.

就有:

上图代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-
hide7.html)应该不会被人看到吧……

显然,运行是OK的。似乎也非常有jQuery的模样了,但是,实际上,跟jQuery比还是有差别的,有个较大的差别。如果是上图代码所示的JS结构,则包装器对象要扩展新方法,每个都需要再写一个原型的。例如,扩展一个attr方法,则要写成:



$.fn.prototype.attr = function() { // ...};

又看到prototype了,高级的东西应该要隐藏住,否则会给人难以上手的感觉。那该怎么办呢?御姐不是好惹的。

脑子动一下就知道了,把F.prototype换成$.fn不久好了。这样,扩展新方法的时候,直接就是



$.fn.attr = function() { // ...};

至此,就使用上讲,与jQuery非常接近了。 但是,还有几个F怎么办呢,总不能就像下面这样放着吧:



var $ = function(selector, context) {
    return new F(selector, context);
};
var F = function(selector, context) {
    return this.init(selector, context);
};

$.fn = F.prototype;

$.fn.init = function(selector, context) { // ... return this;
};
$.fn.each = function(fn) { // ...};
$.fn.hide = function() { // ...};

数学中,我们都学过合并同类项。仔细观察上面的的代码:
$()返回的是new F(),而new
F()又是返回的对象的引用。擦,这返回来返回去的,参数又是一样的,我们是不是可以一次性返回,然后再做些手脚,让$.fn.init返回的this依然能够正确指向。

于是,一番调整有:



var $ = function(selector, context) {
    return new $.fn.init(selector, context);
};
var F = function() { };

$.fn = F.prototype;
$.fn.init = function(selector, context) { // ... return this;
};// ...

上面代码显然是有问题的,new的是$.fn.init, $.fn.init的返回值是this.
也就是$()的返回值是$.fn.init的原型对象,尼玛$.fn.init的prototype原型现在就是个光杆司令啊,哟,正好,$.fn对应的原型方法,除了init没用外,其他hide(),each()就是我们需要的。因此,我们需要加上这么一行:



$.fn.init.prototype = $.fn

于是,$()的返回值从$.fn.init.prototype一下子变成$.fn,正好就是我们一开始的扩展方法。

于是乎,大功告成。慢着……

上面明明还有残留的F呢!

哦,那个啊。F是任意函数,$本身就是函数,因此,直接使用$替换就可以了:



var $ = function(selector, context) {
    return new $.fn.init(selector, context);
};
var F = function() { };   // 这个直接删除
$.fn = $.prototype;
$.fn.init = function(selector, context) { // ... return this;
};// ...

上图代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-
hide9.html)应该不会被人看到吧……

实际上,如果你不是非得一个$行便天下的话,到了上面进阶第9步就足够了。jQuery在第10步的处理是为了彰显其$用得如此的出神入化,代码完美,令人惊叹!

至此,jQuery大核心已经一步一步走完了,可以看到,所有的这些进阶都是根据需求、实际开发需要来的,慢慢完善,慢慢扩充的!

**
11. 每个扩展方法都要$.fn.xxxx, 好闹心的来**



$.fn.css = function() {}
$.fn.attr = function() {}
$.fn.data = function() {}// ...

每个扩展前面都有个$.fn, 好讨厌的感觉,就不能合并吗?

于是,jQuery搞了个extend方法。



$.fn.extend({
    css: function() {},
    attr: function() {},
    data: function() {}, // ...});

**
12. $()不仅可以是选择器字符串,还可以是DOM**
在init方法中,判断第一个参数,如果是节点,直接this[0] = this_node. over!

以下13~?都是完善啊,补充啊,兼容性处理啊什么的,没有价值,到此为止!

三、排了很长队的结束语

网上也有其他一些介绍jQuery原理或机制的文章,可能当事人自己理解,而阅读者本来就不懂,说来说去,越说越绕,可能更不懂了。

jQuery是很优秀,好比身为灵长类的人类。但是,其诞生显然是从简单开始的。因此,要了解人类,可以通过追溯其起源。如果你是上帝,要让你造一个人,你会怎么造,是一口气出来?女娲造人还要捏泥人呢!不妨从单细胞生物还是,随着自然进化,淘汰,自然而然,就会出现人类,上帝他就是这么干的。

jQuery的诞生也大致如此,要想了解jQuery,可以试试踏着本文jQuery的成长足迹,一点一点逐步深入,您就会了解为何jQuery要这么设计,它是如何设计的等。

一、系统环境**

主机名IP
nagios192.168.15.111
mysql_s192.168.15.21

二、操作步骤**

2.1 mysql_s端的配置

2.1.1编写check_mysql_slave监控脚本

cd /usr/local/nagios/libexec #切换到nagios监控插件所在目录

vim check_mysql_slave #开始编写 mysql_slave监控脚本

注意:监控脚本中的mysql账户一定要新建一个,并设置有限的权限。**


2.1.2给脚本增加可执行权限

chmod 755 check_mysql_slave

-rwxr-xr-x 1 root root 471 Oct 16 12:59 check_mysql_slave

2.1.3编辑 nrpe的配置文件

vim /usr/local/nagios/libexec/etc/nrpe.cfg +204

#添加监控mysql主从同步状态的命令

command[check_mysql_slave]=/usr/local/nagios/libexec/check_mysql_slave

2.1.4重新启动 nrpe 服务

2.1.5执行脚本测试输出

[root@mysql_s libexec]# ./check_mysql_slave

OK mysql_s is running

2.2 nagios端的配置:

*2.2.1修改已有的* /usr/local/nagios/etc/objects/
service.cfg配置文件

define service {

use generic-service

host_name mysql_slave

service_description check_21_mysql_replication_status

check_command check_nrpe!check_mysql_slave

max_check_attempts 3

normal_check_interval 2

retry_check_interval 2

check_period 24x7

notification_interval 10

notification_period 24x7

notification_options w,u,c,r

contact_groups admins

process_perf_data 1

}

2.2.2重启nagios**

[root@nagios objects]# /etc/init.d/nagios checkconfig #检查配置文件是否有误

[root@nagios objects]# /etc/init.d/nagios reload #重新加载配置文件

Running configuration check...done.

Stopping nagios: done.

Starting nagios: done.

说明:如果nagios reload完毕,监控页面尚未出现检测结果,可以手动测试

/usr/local/nagios/libexec/check_nrpe -H 192.168.15.21 -c check_mysql_slave

2.2.3**最终效果图
**

DWZ富客户端框架(jQuery RIA framework), 是中国人自己开发的基于jQuery实现的Ajax RIA开源框架. 设计目标是简单实用,快速开发,降低ajax开发成本。 欢迎大家提出建议,我们将在下一版本中进一步调整和完善功能.共同推进国内整体ajax开发水平。 在线演示地...

最近更新: 发布于 2 年 前

jQuery 是一个非常优秀的 JavaScript 框架,而且还有相当多的插件。其中的一些UI插件也相当的给力,比如 Ninja UI,是一款界面插件,使用它将能给你的项目增色不少。此插件包含有幻灯,智能提示等常见的效果。 目前的文档还不是很全,但是官方提供的例子已...

和 jQuery UI 一样,Chico UI 包含 auto-complete, blink, carousel, countdown, date-

picker, dropdown, expand, calendar 等诸多逐渐,同时还提供一个 CSS 布局框架,用于实现网页布局和表格。...

PrimeUI 是 PrimeFaces 团队的一个 jQuery UI 组件库,目前包含多个 UI 部件。

最近更新: 发布于 7 个月 前

基于Jquery的UI库,包含常用UI组件,如:布局、表格、树形、Tabs、工具条、弹出菜单、表单等等。 采用Html5 +

CSS3编写,可以支持常用的浏览器,如:Chrome、FireFox7+、Safari 5+和IE 9+等。

jQueryUI 是一套 jQuery 的页面 UI 插件,包含很多种常用的页面空间,例如 Tabs(如本站首页右上角部分) 、拉帘效果(本站首页左上角)、对话框、拖放效果、日期选择、颜色选择、数据排序、窗体大小调整等等非常多的内容。 下面是一些 jQuery UI 的效果图...

最近更新: 发布于 1 周 前

jQuery Tools 是一个当前网站开发中最最常用的UI组件集合,包括:Tab、工具提示ToolTip、窗口滚动、Overlap、Expose和Flash嵌入,jQuery Tools 只有 5.8k 大小(强烈推荐)。 下图是一个跳格控制的截图 上面效果实现的代码:

最近更新: 发布于 4 年 前

jQuery easyui 为网页开发提供了一堆的常用UI组件,包括菜单、对话框、布局、窗帘、表格、表单等等逐渐, 下图是一个具有布局效果的窗口:

最近更新: 发布于 3 个月 前

LigerUI是基于jQuery开发的一系列控件组,包括表单、布局、表格等等常用UI控件 使用LigerUI可以快速创建风格统一的界面效果

最近更新: 发布于 2 个月 前

jQuery MiniUI - 快速开发WebUI。
包含控件:DataGrid、Tree、TreeGrid、Menu、Toolbar、Tabs、Layout、Panel、DatePicker、ComboBox、TreeSelect、TextBoxList等。

典型应用:页面布局、CRUD、Master/Detail、数据验证等。 技术亮点: 快速开发:使用Htm...

最近更新: 发布于 3 年 前

JQuery Smart
UI是基于JQuery的Ajax开发框架,实现前、后台分离、功能和数据分离,UI层全部使用htm+js+json完成,通过一个统一数据接口与服务端进行数据交换。

主要有三部分组成: 一套日常应用的JQuery插件(类似JQuery UI,JQuery EasyUI),核心基...

这是一个模仿ExtJS区域布局(Border Layout)实现的jQuery

UI页面布局管理器。简单易于使用,东南西北中5个区域可以嵌套使用,外观可以通过CSS控制。

Wijmo是用于创建桌面及移动Web应用程序的HTML5前端控件集。从交互式图表到强大的表格控件,Wijmo包含了用户所需要的一切。Wijmo建立在标准的JavaScript库基础上,就像jQuery

UI和jQuery Mobile一样。此外,Wijmo还集成了多个框架,包括Knockout、AngularJS...

UIKit 是一个小型的、灵活的 JavaScript 的 UI 框架,压缩后只有 4K

大小。提供的UI组件包括:对话框、确认、颜色选择、翻转卡、上下文菜单以及提醒框等等。

很抱歉,ANGELA UI已很长时间没有更新,这段时间我都比较忙,而且当初只是兴趣写一下,可能让很多关注它的同行失望。
现在带给大家一个好消息,这个UI将重写,将改为以类的形式实现,css改为less的形式,js改用coffee来写,敬请期待~。

基于jQuery的UI,最新...

几个 jquery 常用 ui 组件 弹出框:dialog 支持ajax内容,iframe,指定html代码 警告框:alert 页面提示:msg

拖动支持:drag 位置固定:使ie 6 也支持 position:fixed 属性 选项卡切换:tab...

jqxWidgets 是一个复杂的、创新的 UI 部件库,基于 jQuery 开发,可让用户开发非常专业的、跨浏览器支持的 Web应用,主要特点:
Feature complete widgets for jQuery Rich functionality and great performance.

Search-engine friendly. Quick to downl...

XB 软件公司最近发布了JavaScript UI 库Webix ,其中包含的组件超过45个,用这些组件可以构建跟HTML5 和 CSS3
兼容的程序,这些程序不仅能在个人电脑上运行,还能用在iOS、 Android 和 Blackberry 设备上运行。它能访问离线web存储、地理位置(

geolocatio...

最近更新: 发布于 1 个月 前

minjs 是一组轻量级的 jQuery 组件,提供多种 Web 常用组件,包括表单、表格、日历等,其中迷你表单帮助你使用 HTML5

表单增强,尽管浏览器不一定支持也可以使用。

Interface是一个丰富的界面组件的集合,其利用轻量级JavaScript库jQuery。有了这个组件,您可以建立富客户端应用。
Interface拥有MIT和GTL两个协议,基本上意味着您可以在用在商业和非商业。 只要您保持interface每个文件的版本。 示例代码

window.onload ...

一 数字辅助表
数字辅助表是一个只包含从1到N的N个整数的简单表,N通常很大。数字辅助表是一个非常强大的工具,所以我们创建一个持久的数字辅助表:



CREATE TABLE Nums(
a INT UNSIGNED NOT NULL PRIMARY KRY
)ENGINE=InnoDB;

CREATEPRODURE  CreateNums(t  INT  UNSIGNED)
BEGIN
DECLARE  s  INT  UNSIGNEDDEFAULT1;
TRUNCATETABLENums;
INSERTINTONumsSELECTs;
WHILE  s*2<=t  DO
BEGIN
INSERTINTONumsSELECTa+sFROMNums;
SETs=s*2
END;
ENDWHILE;
END;

二 连续范围



CREATETABLEt(a  INT UNSIGNEDNOTNULLPRIMARYKEY);
INSERTINTOtVALUES(1);
INSERTINTOtVALUES(2);
INSERTINTOtVALUES(3);
INSERTINTOtVALUES(100);
INSERTINTOtVALUES(101);
INSERTINTOtVALUES(103);
INSERTINTOtVALUES(104);
INSERTINTOtVALUES(105);

如何得到下面的输出结果呢?
28841896_1417152253253A.png



SELECTMIN(a)start,MAX(a)endFROM(
SELECTa,rn,a-rnASdiff
FROM(SELECTa,@a:=@a+1  rnFROMt,(SELECT@a:=0)ASa)
ASb
)ASc
GROUPBYdiff;

三 最小缺失值

点击(此处)折叠或打开



CREATE  TABLE x(
aINTUNSIGNED  PRIMARY KEY,
b  CHAR(1)NOTNULL
)ENGINE=InnoDB;

INSERTINTOx SELECT 3,'a';
INSERTINTOx SELECT 4,'b';
INSERTINTOx SELECT 6,'c';
INSERTINTOx SELECT 7,'d';

注意a列必须是一个正整数,所以这里的类型为INT UNSGINED。最小缺失值的问题是,假设列a从1开始,对于当前表中的数据3、4、6、7,查询应返回1。
如果当前表的数据为1、2、3、4、6、7,则返回5。
解决方案如下:



SELECT
CASE
WHENNOTEXISTS(SELECTaFROMxWHEREa=1)THEN1
ELSE
(SELECTMIN(a)+1ASmissing
FROMxASA
WHERENOTEXISTS
(SELECT*FROMxASB
WHEREA.a+1=B.a))
ENDASmissing;

运行上面的SQL,得到结果为1,若向a列插入1,2后得到的结果为5。
若要对最小缺失值进行补缺操作,解决方案如下:



INSERTINTOx
SELECT
CASE
WHENNOTEXISTS(SELECTaFROMxWHEREa=1)THEN1
ELSE
(SELECTMIN(a)+1ASmissing
FROMxASA
WHERENOTEXISTS
(SELECT*FROMxASB
WHEREA.a+1=B.a))ENDASmissing,'p';

运行上面的SQL,我们将会在a列插入5,b列插入'p'。

四 获取行号
行号是指按顺序为查询结果集的行分配的连续整数。



CREATETABLEsales(
empidvarchar(10)NOTNULL,
mgridvarchar(10)NOTNULL,
qty` int(11)NOTNULL,
PRIMARYKEY(empid)
);

INSERINTOsalsesVALUES('A',Z',300);
INSER INTO salses VALUES('B',X',100);
INSERINTOsalsesVALUES('C',Y',100);
INSER INTO salses VALUES('D',Z',300);
INSERINTOsalsesVALUES('E',X',200);
INSER INTO salses VALUES('F',Z',100);

现在我们根据empid进行行号统计



SELECTempid,
(SELECTCOUNT(*)FROMsalesAST2
WHERET2.empid<=T1.empid)ASrownum
FROMsalesAST1;

但是上面这句SQL效率不是最理想的,在Mysql数据库中得到行号最快的解决方案是采用CROSS JOIN。