我遇到了需要双重订购的情况。 让我尝试解释一下(为了简单起见,我删除了不必要的列)。
(当前日期 = 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/