在Mysql中的“Order By”中使用复杂表达式

时间:2013-03-06 18:18:50

标签: mysql sql-order-by

我有一张桌子“交易”

+---------+---------+
| deal_id | expired |
+---------+---------+
|       1 |       0 |
|       2 |       0 |
|       3 |       0 |
|       4 |       0 |
|       5 |       1 |
|       6 |       0 |
|       7 |       1 |
|       8 |       1 |
|       9 |       0 |
|      10 |       0 |
+---------+---------+

我想归档以下订单:

1)底部的过期交易

2)交易高于5的deal_id,由deal_id

排序

3)在RAND用种子

命令的底部处理id低于/等于5的id

SELECT deal_id,已过期FROM Deal ORDER by expired = 1,deal_id< 5,rand(1)desc

这个查询是错误的,因为表格的顶部也会按rand排序,而顶部我想通过deal_id desc订购。


这是它应该照顾的方式:

+---------+---------+
| deal_id | expired |
+---------+---------+
|       10|       0 | top part ordered by
|       9 |       0 | deal_id desc 
|       6 |_______0 | if ( deal_id < 5 AND expired = 0 )
|       4 |       0 |  
|       1 |       0 | bottom part ordered
|       5 |       0 | by rand(seed) 
|       7 |       0 | expired = 1 at the bottom
|       5 |       1 |
|       7 |       1 |
|       8 |       1 |
+---------+---------+

是否可以通过在“ORDER BY”中使用表达式来存档? 我知道我可以使用UNION,但我真的不想,它会让我在我的框架中保持简单。

感谢。

2 个答案:

答案 0 :(得分:10)

这样的东西?

SELECT
  deal_id,
  expired
FROM
  Deal
ORDER BY
  expired = 1,
  deal_id < 5,
  case when (expired=1 or deal_id<5)=false
       then deal_id
       else rand()
  end desc

请参阅小提琴here

答案 1 :(得分:1)

您可以使用CASE声明

ORDER BY CASE 
 WHEN expired = 1 THEN 99 
 WHEN deal_id < 5 THEN deal_id 
 WHEN deal_id > 5 THEN Rand() + 5 //so that the value is between 5 and 6
 ELSE 100 END