2017-07-31 26 views
0

我有一種情況,我需要一個雙重命令。 讓我試着解釋它(爲了簡單起見,我刪除了不必要的列)。mysql按順序分爲兩個不同的部分

(的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) 

現在到了棘手的部分。我需要訂購成兩個不同的部分

一個部分: 第一部分需要由user_changed其中 user_changed是48 小時前或更小是一個隨機的順序。

第二部分: 需要訂購剩餘的用戶在user_changed通過user_changed ASC是大於48小時,以便所以從我們的數據庫的實例數據

這應該是結果

1 | John Doe | 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,但它不顯示像我上面描述的那樣。首先是les我們的48。然後,所有剩餘的48小時以上,按照asc – Bham

+0

排序@Bham I切換了'<' and a '>'。 – cwallenpoole