首页
免费后端云服务
关于
推荐
免费图床源码
Search
1
小程序后端入门系列视频教程【一-微信开发工具介绍】
9,730 阅读
2
微信小程序三级联动之多列选择器
9,615 阅读
3
小程序开发免费后端之神秘利器分享
9,543 阅读
4
Golang-开发企业级资源权限管理【第一步表设计】-1
9,093 阅读
5
学会微信服务端开发第一步
8,985 阅读
日常记录
日常
随笔
Bmob后端云
从零开始学物联网
Serverless实战驾校小程序
心邮
Serverless
向量数据库
登录
Search
Magic
累计撰写
124
篇文章
累计收到
157
条评论
首页
栏目
日常记录
日常
随笔
Bmob后端云
从零开始学物联网
Serverless实战驾校小程序
心邮
Serverless
向量数据库
页面
免费后端云服务
关于
推荐
免费图床源码
搜索到
51
篇与
的结果
2015-09-28
Yii Framework 1.1 使用 Bootstrap
相关官网教程以及下载地址: 安装后遇到表单页面无法访问,目前网上没找到相关解决教程,特把解决过程记录于此。 1.错误一 Declaration of BActiveForm::checkBox() should be compatible withCActiveForm::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 withCHtml::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()){ 页面成功显示:
2015年09月28日
8 阅读
0 评论
0 点赞
2014-12-20
jQuery诞生记-原理与机制
一、看似偶然的东西实际是必然会发生的我大学时候在图书馆翻过一本很破旧的书,讲生物理论的,主要内容就是探讨生命的产生是偶然还是必然。里面很多亚里士多德都看不懂的公式计算什么的,还有模拟原始地球环境出现了有机物的实验什么的。总之,书论述的观点是:“在当时的地球环境下,生命的产生是必然的!”无数次机会的偶然条件、无数次化合物的相遇反应等必定会产生有机物,再有N多偶然,有机物必然形成了有机体……这种理论类似于,你是个过马路非常小心的人,且你万寿无疆,除了怕被汽车撞。给你100万年的寿命,你最后必然还是被车撞死。如果以这种理论来看jQuery的出现,结论也应该是必然的 !二、需求、动力、发展、事物产生与jQuery的诞生一个成熟的东西显然不是一口气就出来的,所谓“一铲子挖不了一口井”,我想jQuery的原作者再天才,也是循序渐进过来的,如何个循序渐进法,我想,很有可能就是需求驱动而产生的,好比上图刀削面机器人,据说现在已经第八代了!** 1. gelElementById太长了** 页面上有个按钮,还有个图片,我想点击按钮图片隐藏,如下HTML: 点击我  于是,我的脚本可能就这样: 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创建的匿名对象。上面的引用来自。什么意思呢?说白了就是,newF()如果没有返回值(Undefined类型),或返回值是5种基本型(Undefined类型、Null类型、Boolean类型、Number类型、String类型)之一,则newF()我们可以看成是原型扩展方法中的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()执行。你可能会奇怪了,你刚明明说“newF()直接返回DOM是不可取的”,怎么现在又有return呢?大家务必擦亮眼睛,F.prototype.getElementById的返回值是this,也就是newF()的返回值是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(),而newF()又是返回的对象的引用。擦,这返回来返回去的,参数又是一样的,我们是不是可以一次性返回,然后再做些手脚,让$.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要这么设计,它是如何设计的等。
2014年12月20日
8 阅读
0 评论
0 点赞
2014-10-23
nagios 实现Mysql 主从同步状态的监控
一、系统环境**主机名IPnagios192.168.15.111mysql_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_slave2.1.3编辑 nrpe的配置文件vim /usr/local/nagios/libexec/etc/nrpe.cfg +204#添加监控mysql主从同步状态的命令command[check_mysql_slave]=/usr/local/nagios/libexec/check_mysql_slave2.1.4重新启动 nrpe 服务2.1.5执行脚本测试输出[root@mysql_s libexec]# ./check_mysql_slaveOK mysql_s is running2.2 nagios端的配置:*2.2.1修改已有的* /usr/local/nagios/etc/objects/service.cfg配置文件define service {use generic-servicehost_name mysql_slaveservice_description check_21_mysql_replication_statuscheck_command check_nrpe!check_mysql_slavemax_check_attempts 3normal_check_interval 2retry_check_interval 2check_period 24x7notification_interval 10notification_period 24x7notification_options w,u,c,rcontact_groups adminsprocess_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_slave2.2.3**最终效果图 **
2014年10月23日
7 阅读
0 评论
0 点赞
2014-10-02
jQueryUI 框架推荐
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 SmartUI是基于JQuery的Ajax开发框架,实现前、后台分离、功能和数据分离,UI层全部使用htm+js+json完成,通过一个统一数据接口与服务端进行数据交换。主要有三部分组成: 一套日常应用的JQuery插件(类似JQuery UI,JQuery EasyUI),核心基...这是一个模仿ExtJS区域布局(Border Layout)实现的jQueryUI页面布局管理器。简单易于使用,东南西北中5个区域可以嵌套使用,外观可以通过CSS控制。Wijmo是用于创建桌面及移动Web应用程序的HTML5前端控件集。从交互式图表到强大的表格控件,Wijmo包含了用户所需要的一切。Wijmo建立在标准的JavaScript库基础上,就像jQueryUI和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 ...
2014年10月02日
3 阅读
0 评论
0 点赞
2014-08-25
一些经典的SQL编程问题
一 数字辅助表 数字辅助表是一个只包含从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); 如何得到下面的输出结果呢? 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。
2014年08月25日
1 阅读
0 评论
0 点赞
1
...
3
4
5
...
11