mysqlでorder byはソートを指定できます

9757 ワード

mysqlテーブルのソートORDER BY field 1[ASC[DESC],[field 2...]ASC[DESC],...
ここではnumで並べ替えたいがnum=-1のデータを単独で最大値とする方法1:field(field 1,val 1,val 2,...)
ここでのサイズ順は…>val 2>val 1>field 1(他のデータ)の子の後に進む="order by fieldから大きいorder by fieldまでのUsing filesort(速度の遅い外部ソート)であり、一般的には推奨されません
select * from test order by field(num,-1) asc,num asc;
法二:case when...then...when...then...else...end select*from test order by case when num=-1 then 1 else 0 end desc;
データは2つの部分に分かれています.表のデータは2つの部分に分かれていると思います.num=-1の1つを最大値(特殊部分)として出し、それから他を1つの全体(他の部分)として2つの部分を並べ替え、もう一度並べ替えると所望の効果が得られる方法の2つの例の結果は同じですが、2つ目はもっと使いたいと思っています.大きなもの、小さいものを特殊な部分として自由に選択できるからです
#  test   2    id,name
mysql> desc test;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| num   | int(11)          | NO   |     | 0       |                |
+-------+------------------+------+-----+---------+----------------+
mysql> select * from test;
+----+-----+
| id | num |
+----+-----+
|  1 |  -1 |
|  2 |   0 |
|  3 |   1 |
|  4 |   2 |
|  5 |   3 |
|  6 |   4 |
|  7 |   5 |
+----+-----+
    #             num=-1        
    mysql> select * from test order by field(num,-1) desc;
    mysql> select * from test order by case when num = -1 then 1 else 0 end desc;
    +----+-----+
    | id | num |
    +----+-----+
    |  1 |  -1 |
    |  2 |   0 |
    |  3 |   1 |
    |  4 |   2 |
    |  5 |   3 |
    |  6 |   4 |
    |  7 |   5 |
    +----+-----+

    mysql> select * from test order by field(num,-1) asc;
    mysql> select * from test order by case when num = -1 then 1 else 0 end asc;
    +----+-----+
    | id | num |
    +----+-----+
    |  2 |   0 |
    |  3 |   1 |
    |  4 |   2 |
    |  5 |   3 |
    |  6 |   4 |
    |  7 |   5 |
    |  1 |  -1 |
    +----+-----+

    #        ,        
    mysql> select * from test order by field(num,-1) desc,num desc;
    mysql> select * from test order by case when num = -1 then 1 else 0 end desc, num desc;
    +----+-----+
    | id | num |
    +----+-----+
    |  1 |  -1 |
    |  7 |   5 |
    |  6 |   4 |
    |  5 |   3 |
    |  4 |   2 |
    |  3 |   1 |
    |  2 |   0 |
    +----+-----+

    mysql> select * from test order by field(num,-1) asc,num asc;
    mysql> select * from test order by case when num = -1 then 1 else 0 end asc, num asc;

    +----+-----+
    | id | num |
    +----+-----+
    |  2 |   0 |
    |  3 |   1 |
    |  4 |   2 |
    |  5 |   3 |
    |  6 |   4 |
    |  7 |   5 |
    |  1 |  -1 |
    +----+-----+

    #    num=2               num=2    
    mysql> select * from test order by case when num = 2 then 1 else 0 end desc;
    +----+-----+
    | id | num |
    +----+-----+
    |  4 |   2 |
    |  1 |  -1 |
    |  2 |   0 |
    |  3 |   1 |
    |  5 |   3 |
    |  6 |   4 |
    |  7 |   5 |
    +----+-----+

    #     num=2               num=2    
    mysql> select * from test order by case when num = 2 then 0 else 1 end;
    +----+-----+
    | id | num |
    +----+-----+
    |  4 |   2 |
    |  1 |  -1 |
    |  2 |   0 |
    |  3 |   1 |
    |  5 |   3 |
    |  6 |   4 |
    |  7 |   5 |
    +----+-----+