MYSQL ORDER BY 使用 if 以及使用 IN

本文非原创,原文在这里

有如下表数据

    +----+------+
    | 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语句,看成一个独立的column,然后进行排序,你可以在IF语句后添加排序条件ASC或者DESC,当然,默认的排序是ASC,可以不写,上面的例子,加入你想让type=3的数据排在后面,就可以IF语句后面添加DESC了,如下:

    SELECT * FROM test 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排序的时候,就被放在在最后。

其他情况类推

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • SQL的排序问题,他把符合条件的单独几行,可以放在查询结果的开始,或者查询结果的尾部通过的方法就是IN语句(也可以...
    体胖勤跑步阅读 4,057评论 2 1
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,905评论 0 38
  • 战罢沙场月色寒 引子 文圭王朝建制逾七百年,是中州自古以来国祚最长久,最富庶,百姓最安居乐业的一个朝代。出现了高,...
    关雎黍离阅读 1,057评论 0 0
  • 熬到现在看完了十二公民,看之前只是抱着随便看看的想法,没想到一口气看完不禁拍手称赞。(许久没写过影评,也没有如此多...
    桑乐个咪阅读 202评论 0 0
  • I exist because you need me 如果我真的存在,也是因为你需要我。 “如果命运是一条孤独的...
    胡崽崽阅读 522评论 6 13