zoukankan      html  css  js  c++  java
  • Order By 问题集合

    问题(一):Order By 多个参数排序

    在做多字段的排序的时候我们经常会会用到该语句。

    所以多参数排序是从左到右的局部排序,修改的范围只有前面参数(几个参数)相同的情况下在排序。


    select * from table order by  参数1 , 参数2 DESC …… limit ?


    在做多字段的排序的时候我们经常会会用到该语句。

    这里的参数1 是按照 ASC 排序所以就可以省略,参数2 是按照DESC排序,由于

    大多数 where 后面的过滤条件是从右到左,而Order by后面的顺序应该怎么的?


    这里的顺序是从参数1,参数2这么开始排序的,是从左到右。

    比如:把参数1的排完,在排序参数2,但参数2的排序并非对参数1的数据重新排序,

    而是对参数1相同的数据进行排序。


    误解:

    很多人想得到100个最小的x,但想把这100个数据按照y从小到大的排序,于是就写这样

    的SQL语句


    select * from table x ASC,y DESC  limit 100


    这就是我们理解错了,这里的y只是对排好的x相同的数据进行排序,如果这100个数据x完全

    不同,后面添加对y的排序时是没有影响的。这里只对x相同的数据进行局部的y排序。

    变化如下:

    1-2          1-2

    2-1          2-3

    2-3          2-1

    3-4          3-4

    ……

    所以多参数排序是从左到右的局部排序,修改的范围只有前面参数(几个参数)相同的情况下在排序。

    比如:ORDER BY h.floor*1,convert(h.floor using gbk) asc

     图解:


    问题(二):Order By 根据 IF 条件对字段进行排序

    比如:ORDER BY IF(a.state = '1',0,1),a.update_date DESC

    图解:

    同理可得:不同条件下都可以通过 IF 来对字段进行排序

    【Oracle 结论】 
    order by colum asc 时,null默认被放在最后
    order by colum desc 时,null默认被放在最前
    nulls first 时,强制null放在最前,不为null的按声明顺序[asc|desc]进行排序(select update_date from table_name order by update_date nulls first;
    nulls last 时,强制null放在最后,不为null的按声明顺序[asc|desc]进行排序(select update_date from table_name order by update_date nulls last;
    【MySql 结论】
    order by colum asc 时,null默认被放在最前
    order by colum desc 时,null默认被放在最后
    ORDER BY IF(ISNULL(update_date),0,1)    null被强制放在最前,不为null的按声明顺序[asc|desc]进行排序
    ORDER BY IF(ISNULL(update_date),1,0)    null被强制放在最后,不为null的按声明顺序[asc|desc]进行排序


    问题(三):Order By 字母数字混合字段排序问题
    对MySQL数据表里的一个字符型字段排序,其内容格式为一位字母+顺序数字。数字没有前导零,长度不固定。
    这种含字母的数字序列,排序出来的结果和我们想要的结果是不一样的,因为它不是纯数字,只能按字符规则排。
    结果是A1,A10,A11,A12。。。。A19,A2,A20,A21。。。。
    而不是我们通常感觉中的A1,A2,A3,。。。。。A10,A11,这样的结果。
    想要得到正确的排序有两个办法。
    一是改变字段内容结构,在数字前加上零,让所有的字段值拥有相同的长度。
    二是不改变字段内容,在排序的SQL语句上想办法。

    order by mid(column,2,10) +1

    mid()第一个参数是字串内容,可以是字段名。第二个参数是起始字符的位置,我这里需要从第二个字符开始。第三个参数是需要取得的长度,要选一个可以包含所有字段内容长度的值,宁大勿小。
    但这样取出来的还只是“数字内容的字符串”,对它排序仍然使用字符规则,不会得到我们想要的结果。
    这时需要给这个结果再加上一个数值,让MySQL对它进行一次算术运算,然后得到的就是一个整型值,这时再排序就是数字顺序的结果了。
    例如:
    SELECT * FROM equipmentmes ORDER BY MID(eqid,2,10) +1

  • 相关阅读:
    随机森林算法参数调优
    BAYES和朴素BAYES
    阿里云 金融接口 token PHP
    PHP mysql 按时间分组 表格table 跨度 rowspan
    MySql按周,按月,按日分组统计数据
    PHP 获取今日、昨日、本周、上周、本月的等等常用的起始时间戳和结束时间戳的时间处理类
    thinkphp5 tp5 会话控制 session 登录 退出 检查检验登录 判断是否应该跳转到上次url
    微信 模板消息
    php 腾讯 地图 api 计算 坐标 两点 距离 微信 网页 WebService API
    php添加http头禁止浏览器缓存
  • 原文地址:https://www.cnblogs.com/molashaonian/p/7242023.html
Copyright © 2011-2022 走看看