mysql命令分为两个不同的部分

时间:2017-07-31 17:49:53

标签: mysql sorting sql-order-by grouping

我的情况是需要双重订单。 让我试着解释一下(为了简单起见,我删除了不必要的列)。

(currentDate = 2017-07-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 ASC

的顺序订购user_changed大于48小时的剩余用户

因此,使用我们数据库中的示例数据,这应该是结果

1 | John Doe 2017-07-31 12:22:58

2 |测试名称| 2017-07-30 09: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 个答案:

答案 0 :(得分: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小时内的事情设置为将来添加随机日期的某些值。