MySQL ORDER BY IF() 条件排序 您所在的位置:网站首页 mysql升序排序添加条件数据 MySQL ORDER BY IF() 条件排序

MySQL ORDER BY IF() 条件排序

2024-07-11 06:53| 来源: 网络整理| 查看: 265

在做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附加一个隐藏属性,这个隐藏属性,可以是0或者1

什么意思呢?就是在对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 版权声明:本文为博主原创文章,转载请附上博文链接!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有