【问题标题】:Random Sorting MySQL - Same order if element is altered/removed?随机排序 MySQL - 如果元素被更改/删除,顺序相同?
【发布时间】:2014-04-04 01:51:31
【问题描述】:

假设我有下表

Table1

item, value
----------------------
1        1      
2        2       
3        1       
4        1       
5        1

假设先按值 DESC 排序,然后按 rand() 排序会得到 2,4,3,5,1 作为顺序

如果第 3 项的值随后更改为 3

Table1

item, value
----------------------
1        1      
2        2       
3        3       
4        1       
5        1

然后排序顺序将更改为 3,2,5,1,4。

所以我的问题是:排序顺序是否仍然存在并且只有更改的对象才能在列表中向上移动?所以我对第一个列表的预期结果是 2,4,3,5,1,第二个是 3,2,4,5,1。所以 3 只是简单地向上移动列表而不改变其他随机排序元素的位置。我希望这是有道理的。

【问题讨论】:

    标签: mysql database sorting random


    【解决方案1】:

    是的,您可以尝试使用rand(number),其中数字是种子编号(您喜欢的任何数字) 所以像

    SELECT item FROM table1 ORDER BY value desc, rand(1)
    

    sqlFiddle 在小提琴中,table1 和 table2 完全相同,除了第 3 项的值,看看rand() 是如何使用种子的。

    【讨论】:

    • 如果元素被移动,这可以工作,但是如果元素被删除,是否仍然可以这样做? sqlFiddle example
    • 有一种方法,不删除项目,而是用另一列将其标记为已删除,然后对 where deleted = 0 进行外部选择 sqlfiddle
    【解决方案2】:

    我不确定您是否可以在表格中再添加一列。如果可以的话, 向表中添加一列,每当更新记录时,该列会自动使用当前时间戳进行更新。然后您可以按该时间戳字段排序,然后按 rand。

    ALTER TABLE table_name 
    ADD COLUMN update_time TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP;
    

    然后您可以像这样订购:ORDER BY update_time, rand();

    【讨论】:

    • 为什么按记录更新时间排序会有帮助?我正在尝试实现随机排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2012-11-19
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多