zoukankan      html  css  js  c++  java
  • MySQL order by if()或order by in()条件排序

    需求背景

       在做商品管理的时候,碰到一个SQL的排序问题,需要把上架的商品排在下架商品之前。一番折腾后,搜索到了条件排序语句 order by if(),小编在此和大家分享一下。本文测试数据存在如下所示的表test中:
    +----+------+
    | id | type |
    +----+------+
    | 1 | 1 |
    | 2 | 1 |
    | 3 | 1 |
    | 4 | 2 |
    | 5 | 2 |
    | 6 | 3 |
    | 7 | 3 |
    | 8 | 4 |
    | 9 | 4 |
    | 10 | 4 |
    +----+------+

    使用 IF 语句

       想要 type=3 的记录排在前面,type为其他值的排在后面,可以这样写SQL:
    SELECT * FROM test ORDER BY IF(type=3,0,1);

     结果如下:

    +----+------+
    | id | type |
    +----+------+
    | 6 | 3 |
    | 7 | 3 |
    | 1 | 1 |
    | 2 | 1 |
    | 3 | 1 |
    | 4 | 2 |
    | 5 | 2 |
    | 8 | 4 |
    | 9 | 4 |
    | 10 | 4 |
    +----+------+
       解释:IF(type=3,0,1)的意思是,对 type 附加一个隐藏属性,这个隐藏属性的值可以是0或者1;在对 type进行排序的时候,优先判断type是不是等于3,如果等于,则返回0;否则,返回1。然后对type隐藏属性进行排序,也就是对0和1进行排序。
       总而言之,可以把IF语句视作一个独立的字段,用于order by之后进行排序。假如想让type=3的数据排在后面,就可以IF语句后面添加DESC了,如下:
    SELECT * FROM test ORDER BY IF(type=3,0,1) DESC;

     结果如下:

    +----+------+
    | id | type |
    +----+------+
    | 1 | 1 |
    | 2 | 1 |
    | 3 | 1 |
    | 4 | 2 |
    | 5 | 2 |
    | 8 | 4 |
    | 9 | 4 |
    | 10 | 4 |
    | 6 | 3 |
    | 7 | 3 |
    +----+------+
       另外,你在进行隐藏属性优先排序的同时,对于剩下的排序,你也可以另外进行ASC或者DESC的排序

    使用 IN 语句

      上面的例子是满足单个条件,返回0 或者 1,如果需要用到一个范围呢?比如想让 type =2或者type=3的行排在前面呢?可以使用 IN 语句
    SELECT * FROM ORDER BY type IN (2,3) DESC

     结果如下

    +----+------+
    | id | type |
    +----+------+
    | 4 | 2 |
    | 5 | 2 |
    | 6 | 3 |
    | 7 | 3 |
    | 1 | 1 |
    | 2 | 1 |
    | 3 | 1 |
    | 8 | 4 |
    | 9 | 4 |
    | 10 | 4 |
    +----+------+
       下面分析语句type IN (2,3) DESC, type IN 语句进行判断,如果type的值在(2,3)里面,返回1,否则返回0,所以,满足条件的数据,因为返回值是1,进行DESC排序的时候,就被放在最后。
       其他情况以此类推。好记性不如烂笔头,因为平时用的时候只是用IN来筛选,很少遇到和排序相结合的场景,所以记录一下。

    Reference 

  • 相关阅读:
    B. Gerald is into Art
    day 56 Django介绍
    day 55 bootstrap应用
    Python学习之变量的作用域
    day 54 JQ用法
    day 53 BOM与DOM
    day 52 js语法
    day 51 label标签,文字属性,背景属性,边框,display属性,盒模型,浮动,overflow,定位,z-index和模态框
    day 50 form表单,input框,textarea,select,css的引入方式,标签嵌套,选择器,宽高属性,字体属性
    day 49 html标签介绍,标题、段落、a、img、表格、特殊符号、常用标签、div、span
  • 原文地址:https://www.cnblogs.com/east7/p/13337570.html
Copyright © 2011-2022 走看看