MySQL ORDER BY IF() 条件排序
在做sqlzoo的时候,碰到一个SQL的排序问题,他把符合条件的单独几行,可以放在查询结果的开始,或者查询结果的尾部
通过的方法就是IN语句(也可以通过IF语句)
自己做了个测试,如下,这个是表的所有内容
使用ORDER BY配合IF语句
比如我想将species为snake的行数,单独列出来,我可以这样查询
SELECT * FROM pet ORDER BY if (species='snake',0,1),species;
结果如下
我们可以看到,species为snake的行数,被强行放置到了查询结果开头
这是怎么做到的呢?
这里需要注意:
if (species='snake',0,1),species;
这句话的意思是,我对species进行排序的同时,给species附加一个
什么意思呢?就是在对species排序的时候,优先级是判断species是否为snake,如果是,返回0,如果不是,返回1.
随后,先进行species隐藏属性的排序,隐藏属性拍完以后,再进行剩余species的排序
也就是说,你可以把这个 if 语句,看成是一个独立的column
那如果我们想把snake的这一行放在查询结果尾部呢?
那你可以这样写 SELECT * FROM pet ORDER BY if(species='snake',0,1) DESC,species;
正如上面一段说的,你可以把if 语句看成是独立的column,所以你也可以为他添加排序条件ASC或者DESC,当然默认是ASC,可以不写。
这样,查询就等于第一步是查询隐藏属性0,1,然后进行DESC排序,因为species=snake的返回值是0,所以进行倒序排列时,就被排在了最后
以此类推,你在进行隐藏属性优先排序的同时,对于剩下的排序,你也可以另外进行ASC或者DESC的排序,就不截图了。
使用ORDER BY配合IN语句
上面一个是满足单个条件,返回0或者1,那如果需要用到一个范围呢?你可以使用IN语句
比如下面,我要求把出生日期为1993-02-04或者1989-05-13的行数,排在最后
SELECT * FROM pet ORDER BY birth IN('1993-02-04','1989-05-13'),birth;
这样的话,birth IN语句会进行判断,如果birth满足条件,返回1,不满足,返回0
所以,满足条件的两行,因为返回值是1,进行ASC排序的时候,就被放置在了最后。
========================================================================================
关于order by后面接条件查询
适用场景,如表tab_a 有三个字段,
如果field1非空则按升序排列,
如果field1是空再排field2,
如果 field2非空升序排列,
如果field2是空再排field3,
如果field3非空则升序排列,
如果field3是空。。。。。。。。
例子1 排序boolean类型
CREATE TABLE `tab_b` (
`field` varchar(255) default NULL,
`id` int(11) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tab_b` VALUES ('1', 'ture');
INSERT INTO `tab_b` VALUES ('2', 'ture');
INSERT INTO `tab_b` VALUES ('3', 'false');
INSERT INTO `tab_b` VALUES ('4', 'false');
SELECT * from TAB_B ORDER BY field='true' desc
注意:ORDER by 后接的字段如果是boolean属性,则false比ture ‘大’!!!!!
########################################################
DROP TABLE IF EXISTS `tab_a`;
CREATE TABLE `tab_a` (
`id` int(11) NOT NULL,
`field3` int(11) default NULL,
`field2` int(11) default NULL,
`field1` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tab_a` VALUES ('1', '1', '1', '1');
INSERT INTO `tab_a` VALUES ('2', '2', '2', '2');
INSERT INTO `tab_a` VALUES ('3', '3', '3', null);
INSERT INTO `tab_a` VALUES ('4', '4', null, null);
INSERT INTO `tab_a` VALUES ('5', '5', '5', null);
INSERT INTO `tab_a` VALUES ('6', null, null, null);
INSERT INTO `tab_a` VALUES ('7', null, null, null);
INSERT INTO `tab_a` VALUES ('8', '8', null, null);
SELECT * FROM TAB_A ORDER BY
field1='' desc , field1 asc,
field2='' desc , field2 asc,
field3='' desc ,field3 asc
此处field1='' 可以看成boolean排序 desc 排序,field1=''为真的排在下面(因为看上面"注意"),否则排在上面(即field1!='');
而后面的field1 asc相当于排序field1!=''数据,依次排序field2,field3..........
---------------------
作者:changliangwl
来源:CSDN
原文:https://blog.csdn.net/changliangwl/article/details/42777551
版权声明:本文为博主原创文章,转载请附上博文链接!
MySQL ORDER BY IF() 条件排序的更多相关文章
- Mysql order by 多字段排序
mysql单个字段降序排序: select * from table order by id desc; mysql单个字段升序排序: select * from table order by id ...
- mysql order by 多样依照排序
如果先按a排序升序,a相同时按b降序排序 则order by a,b desc
- mysql order by多个字段
Mysql order by 多字段排序 mysql单个字段降序排序: select * from table order by id desc; mysql单个字段升序排序: select * fr ...
- MYSQL order by排序与索引关系总结
MySQL InnoDB B-Tree索引使用Tips 这里主要讨论一下InnoDB B-Tree索引的使用,不提设计,只管使用.B-Tree索引主要作用于WHERE和ORDER BY子句.这里讨论的 ...
- Oracle order by case when 多条件排序
ORACLE sql 排序 根据两个条件排序,根据id号由小到大排序,同时country字段是北京的排最前面前面,其次上海,..大连,最后是其他城市,怎么写? 写法如下:select * from p ...
- Mysql Order By 字符串排序,mysql 字符串order by
Mysql Order By 字符串排序,mysql 字符串order by ============================== ©Copyright 蕃薯耀 2017年9月30日 http ...
- mysql order by 排序的问题
参考博客http://blog.csdn.net/hollboy/article/details/13296601 mysql order by 的排序在今天时候遇到了问题 情景是:将排序的字段设置成 ...
- mysql order by 中文 排序
mysql order by 中文 排序 1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都 ...
- Mysql order by 排序 varchar 类型数据
Mysql order by 排序 varchar 类型数据 varchar 类型字段排序, 会將数字当成字符串来处理. 排序规则一般是从左到右一位位来比较. +0之后 就转化成INT 类型排序 ...
随机推荐
- Oracle - 创建表视图等 - DDL
解锁scott: sqlplus / as sysdba; alter user scott account unlock; alter user scott identified by tiger; ...
- execute ps1 with pwsh.exe
pwsh -file C:\Users\clu\source\repos\Edenred\LISA_5.0.0.0\LISA.ControlPanel\LISA.ControlPanel\bin\Re ...
- YTU 2895: H--唱歌的鸟儿
2895: H--唱歌的鸟儿 时间限制: 1 Sec 内存限制: 128 MB 提交: 26 解决: 10 题目描述 烟大东门有一棵大杨树,树上经常会有很多鸟儿飞来飞去.春天来了,学生物的小姜发现 ...
- hdu 3333(树状数组 + 离线操作)
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- asp.net MVC 枚举类型的处理的几种方式
枚举类型本质上是int类型,整型,这是非常重要的一点. 可以使用(int)将它强制转换为 整形.如果要使用MVC5提供的新辅助方法@Html.EnumDropDownListFor()方法,就必须将枚 ...
- Asp.net MVC 中Code First 迁移使用
如果模型类(数据库上下文类Context和POCO类)发生改变,与数据库中的结构不一致,系统默认会抛出一个异常.可以考虑使用代码优先迁移. 代码优先迁移执行UpSert数据库操作,它在每一次更新数据库 ...
- 04_显示意图打开activity
实际上用显式意图打开一个activity就很简单了.只需要指定你要打开的这个activity的class就可以了. 需要注意一点的是创建了一个ThirdActivity必须要在清单文件里面声明.如果没 ...
- Codeforces Round #386 (Div. 2)G. New Roads [构造][树]
题目链接:G. New Roads 题意:给出n个结点,t层深度,每层有a[i]个结点,总共有k个叶子结点,构造一棵树. 分析: 考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那 ...
- [BZOJ1453]Dface双面棋盘
Description Input Output Sample Input Sample Output HINT 线段树+并查集,暴力记录和更新一些信息,详情见代码注解. #include<cm ...
- [USACO 2012 Jan Silver] Delivery Route【拆点】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=106 这道题还真是完全没思路,真的不知道怎么做,但是看了题解后恍然大悟. ...