【问题标题】:mysql order by into two different partsmysql order by 分为两个不同的部分
【发布时间】:2018-01-07 09:40:26
【问题描述】:

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

(当前日期 = 2017-07-31)

我有一个名为 user 的表,就像这样

 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 |约翰·多伊 | 2017-07-31 12:22:58

2 |测试名称| 2017-07-30 09:17:18

这两个需要随机顺序,因为它们不到 48 小时 所有其他用户(超过 48 小时)都需要 user_changed ASC 的订单,就像这样

3 |摇滚 | 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;

【问题讨论】:

    标签: mysql sorting sql-order-by grouping


    【解决方案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 小时的内容设置为未来的某个值,并添加随机日期。

    【讨论】:

    • 我试过你的查询@Cwallenpoole,但它不像我上面描述的那样显示。首先是 les,然后是 48 我们的。然后所有剩余的因此 48 小时及更长按 asc 排序
    • @Bham 我切换了&lt;&gt;
    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多