mysql order by 分为两个不同的部分

标签 mysql sorting sql-order-by grouping

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

(当前日期 = 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 大于 48 小时的剩余用户进行排序,并按 user_changed ASC 排序

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

1 |约翰·多伊 | 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;

最佳答案

我会尝试这样的事情:

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 小时内的内容设置为 future 的某个值,并添加随机日期。

关于mysql order by 分为两个不同的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45422278/

相关文章:

python - 如何使用 sorted() 同时对两列进行排序

R:重新排列数据框中行的顺序

SQL 查询,每组选择 5 个最近的

sql-server - 正确排序 SQL Server 中存储为字符的点数字

mysql - 插入新行,除非其中一个值与另一行匹配?

android - 如何在 Android Studio 中使用 Google Endpoints 写入 Cloud SQL

mysql - azk - 如何设置测试数据库?

java - 来自 JDL 的 SQL DDL - Jhipster

ruby - 按长度重新排列 FASTA 格式文件中的序列?

mysql - 优先于列的条件排序