我有一张桌子“交易”
+---------+---------+
| 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的idSELECT 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,但我真的不想,它会让我在我的框架中保持简单。
感谢。
答案 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