2017-07-31 4 views
0

私は二重注文が必要な状況を抱えています。 私はそれを説明しようとします(簡単にするために、不要な列を削除しました)。mysqlは2つの異なる部分に分けて注文します。

(CURRENTDATE = 2017年7月31日)

私はテーブルには、今トリッキーな部分が来るので

user_id | username | user_changed 
--------------------------------- 
1  | John Doe | 2017-07-31 12:22:58 (less then 48 hours) 
2  | Test name| 2017-07-30 09:17:18 (less the 48 hours) 
4  | itRocks2 | 2017-07-28 07:45:52 (greater then 48 hours) 
3  | itRocks | 2017-07-29 07:45:52 (greater then 48 hours) 

ようユーザーと呼ばれてきました。私は2つの異なる部分

に注文する必要がありパート1: 最初の部分は user_changedは48 時間前に以下ですuser_changedによってランダムな順序である必要があります。

パート2: ニーズが

だから、当社のデータベースからのサンプルデータと、これは結果

あるべきuser_changedがuser_changed ASC順で48時間、次に大きい残りのユーザを注文します1 |ジョン・ドゥー| 2017-07-31 12:22:58

2 |テスト名| 2017年7月30日9時17分18秒

これら二つのニーズランダムな順序彼らは48時間 他のすべてのユーザー(48時間以上)、次に小さいのでuser_changed ASCによって順序を必要とするので、

のような

3 | itRocks | 2017-07-29 07:45:52(例52時間)

4 | itRocks2 | 2017-07-28 07:45:52(例60時間)

また、後で自分のビューでユーザーをグループ化するには、user_idによるデフォルトの注文が必要です。だから私が試したいくつかのクエリ:

クエリ1

SELECT  *, if(user_changed >= SUBDATE(NOW(), INTERVAL 48 HOUR), RAND(), 0) AS rndOrder 
FROM  users 
ORDER BY user_id, rndOrder ASC 

クエリ2

SELECT  *, if(user_changed >= SUBDATE(NOW(), INTERVAL 48 HOUR), "true", "false") AS rndOrder 
FROM  users 
ORDER BY user_id ASC,  
      CASE 
       WHEN rndOrder = 1 THEN user_changed RAND() 
       WHEN frndOrder = 0 THEN user_changed ASC 
      END; 

答えて

1

私はこのような何かをしようとするだろう:

基本的に
SELECT  * 
FROM  users 
ORDER BY user_id ASC,  
     CASE 
      WHEN user_changed <= SUBDATE(NOW(), INTERVAL 48 HOUR) THEN 
       ADDDATE(CURDATE(), 1 + (FLOOR(1 + RAND() * 10000))) 
      ELSE user_changed 
     END ASC; 

、注文の一貫性を維持する過去48時間のものを将来のある値に設定し、ランダムな日付を追加します。

+0

私はあなたのクエリ@Cwallenpooleを試しましたが、上記のようには表示されません。最初に、その後、私たちは48私たち。それから48時間以上残っている残りのすべては、昇順でソートされています。 – Bham

+0

@Bham私は '<' and a '>'を切り替えました。 – cwallenpoole

関連する問題