7

私はテーブル「取引」を持っています

+---------+---------+
| 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) deal_id の順に並べた、deal_id が 5 より大きい取引

3) シードを使用して RAND によって順序付けられた下部の id が小さい/等しい 5 を処理します。


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 を使用できることはわかっていますが、実際には使用したくありません。フレームワークで物事を単純に保つことができます。

ありがとう。

4

2 に答える 2

13

このようなもの?

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

ここでフィドルを参照してください。

于 2013-03-06T18:26:56.667 に答える
4

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
于 2013-03-06T18:23:52.983 に答える