Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用IF语句对ASC和DESC进行排序取决于另一列值_Mysql_Sql_Laravel - Fatal编程技术网

Mysql 使用IF语句对ASC和DESC进行排序取决于另一列值

Mysql 使用IF语句对ASC和DESC进行排序取决于另一列值,mysql,sql,laravel,Mysql,Sql,Laravel,我对SQL有点陌生,需要按日期对列进行排序 已尝试此代码,但不起作用: SELECT * FROM `onetime_contest` ORDER BY `onetime_contest`.`status` ASC, IF (@status = 'live', `onetime_contest`.`valid_till`, '') ASC, IF (@status = 'waiting', `onetime_contest`.`valid_till`,

我对SQL有点陌生,需要按日期对列进行排序

已尝试此代码,但不起作用:

SELECT   * 
FROM     `onetime_contest`  
ORDER BY `onetime_contest`.`status` ASC,
      IF (@status = 'live', `onetime_contest`.`valid_till`, '') ASC,
      IF (@status = 'waiting', `onetime_contest`.`valid_till`, '') ASC,
      IF (@status = 'completed', `onetime_contest`.`valid_till`, '') DESC,
      IF (@status = 'not_actual', `onetime_contest`.`valid_till`,'') DESC

老实说,我不知道为什么会这样,只是它似乎说服mysql遵守子查询中的ORDERBY子句

drop table if exists `onetime_contest`;
create table `onetime_contest`(id int, status varchar(20),valid_till date);
insert into `onetime_contest` values
(1,'live','2017-01-01'),
(2,'waiting','2017-01-01'),
(3,'completed','2017-01-01'),
(4,'not-actual','2017-01-01'),

(5,'live','2017-06-01'),
(6,'waiting','2017-06-01'),
(7,'completed','2017-06-01'),
(8,'not-actual','2017-06-01');

ariaDB [sandbox]> select * from
    -> (SELECT 1 sortorder,id,status,valid_till
    -> #if(ot.valid_till <> @p,@rn:=@rn -  1 , @rn:=@rn) rn,
    -> #@p:=ot.valid_till
    -> FROM  (select @rn:=999999,@p:='1957-01-01') b,`onetime_contest` ot
    -> where status = 'live'
    -> order by valid_till asc
    -> ) a
    -> union
    -> select * from
    -> (SELECT 2 sortorder,id,status,valid_till
    -> #if(ot.valid_till <> @p1,@rn1:=@rn1 +  1 , @rn1:=@rn1) rn,
    -> #@p1:=ot.valid_till
    -> FROM  (select @rn1:=0,@p1:='1957-01-01') b,`onetime_contest` ot
    -> where status = 'not-actual'
    -> order by valid_till desc
    -> ) b
    -> union
    -> select * from
    -> (SELECT 3 sortorder,id,status,valid_till
    -> #if(ot.valid_till <> @p2,@rn2:=@rn2 -  1 , @rn2:=@rn2) rn,
    -> #@p2:=ot.valid_till
    -> FROM  (select @rn2:=999999,@p2:='1957-01-01') b,`onetime_contest` ot
    -> where status = 'completed'
    -> order by valid_till desc
    -> ) c
    -> ;;
+-----------+------+------------+------------+
| sortorder | id   | status     | valid_till |
+-----------+------+------------+------------+
|         1 |    1 | live       | 2017-01-01 |
|         1 |    5 | live       | 2017-06-01 |
|         2 |    8 | not-actual | 2017-06-01 |
|         2 |    4 | not-actual | 2017-01-01 |
|         3 |    7 | completed  | 2017-06-01 |
|         3 |    3 | completed  | 2017-01-01 |
+-----------+------+------------+------------+
6 rows in set (0.00 sec)

不工作意味着??按错误的顺序排序:我认为核心是写不正确的或类似的smth。