表有两个字段:id,gmt_created
我需要一个SQL:如果是上个月及以前的记录,按记录的id倒叙排序;如果是这个月的记录,按记录的id降序排序。

解决方案 »

  1.   

    select *
    from 表
    order by (gmt_created<=curdate()-interval day(curdate()) day), id desc
      

  2.   

    select * from tt
    ORDER BY id*IF(month(gmt_created)=month(curdate()),1,-1)
      

  3.   


    不好意思啊,真心不了解这句sql是真么意思,能否讲解一下。
      

  4.   

    mysql> SELECT * FROM T1;
    +----+------------+
    | id | da         |
    +----+------------+
    |  1 | 2012-01-01 |
    |  2 | 2012-02-01 |
    |  3 | 2012-10-01 |
    |  4 | 2012-05-01 |
    |  5 | 2012-06-01 |
    |  6 | 2012-10-31 |
    +----+------------+
    6 rows in set (0.00 sec)mysql> SELECT * FROM t1 ORDER BY id*IF(MONTH(da)=MONTH(CURDATE()),1,-1);
    +----+------------+
    | id | da         |
    +----+------------+
    |  5 | 2012-06-01 |
    |  4 | 2012-05-01 |
    |  2 | 2012-02-01 |
    |  1 | 2012-01-01 |
    |  3 | 2012-10-01 |
    |  6 | 2012-10-31 |
    +----+------------+
    6 rows in set (0.00 sec)mysql>
    是这样?
      

  5.   

    就是先把这个月的数据按id降序排序,再把上个月以及之前的数据按id降序排序。
      

  6.   


    谢谢你给的灵感,我已经找到需要的sql了。我详细的需求是这样的:
    1. 我要分页获取全部记录;
    2. 所有记录分为“3天内的记录”和“3天前的记录”;
    3. 总体上,“3天内的记录”应该排前,“3天后的记录”应该排后;
    4. 如果是7天以内的记录,则按“旧的派前,新的拍后”;
    5. 如果是7天以前的记录,则按“新的排前,旧的排后”;比如:【7,6,5,4,3,2,1】(今天是第7天,昨天是第6天)分为两段【7,6,5】【4,3,2,1】,
    我最终要的结果是【5,6,7,4,3,2,1】。
    然后,我发现可以这样来:
    如果是【7,6,5】,用【7】减去每个数,就是【7-7,7-6,7-5】=【0,1,2】;
    如果是【4,3,2,1】,每个数减去【7】,就是【4-7,3-7,2-7,1-7】=【-3,-4,-5,-6】;
    得到【7,6,5,4,3,2,1】对应的序列【0,1,2,-3,-4,-5,-6】;
    最后倒叙排序,得到【5,6,7,4,3,2,1】的对应序列【2,1,0,-3,-4,-5,-6】我最终的SQL大概是这样的,有什么地方可以优化吗:SELECT gmt_created FROM 表名
        ORDER BY ( TO_DAYS(NOW()) - TO_DAYS(gmt_create) ) * 
            IF ( TO_DAYS(CURDATE()) - TO_DAYS(gmt_create) < 3, 1, -1) DESC;
      

  7.   

    没有,除非建立冗余字段,保存( TO_DAYS(NOW()) - TO_DAYS(gmt_create) ) * 
            IF ( TO_DAYS(CURDATE()) - TO_DAYS(gmt_create) < 3, 1, -1)
    结果,在此字段上建立索引