【问题标题】:Updating MySQL Table With Random Sorting使用随机排序更新 MySQL 表
【发布时间】:2012-08-04 20:15:37
【问题描述】:

我有一张这样的桌子

ItemsTable

item_id, cat_id, sort
----------------------
1        1       1
20       1       2
15       1       3
12       1       4
11       1       5
....
1521     1       1991

在我的程序中,每次显示页面时,它都会根据排序号拉下一个项目。所以,假设我刚刚显示 sort = 2,下一次页面将显示 item sort = 3(也许 sort 是一个坏名字)。

我想要做的是,一旦我拉出最后一个项目(排序 = 1991),我想重新更新该表中的项目并重新分配新的排序顺序。

像这样:

ItemsTable

item_id, cat_id, sort
----------------------
35       1       1
7        1       2
2        1       3
1521     1       4
700      1       5
....
5        1       1991

现在我的想法是我必须编写一个 SELECTS 记录的脚本,其中 cat_id = 1 对结果进行随机排序,然后我必须在 PHP 中创建一个循环来更新数据库 1001 次。在我看来,这似乎效率不高。

你们能提供更好的选择吗?使用 MySQL 最有效的方法是什么?

【问题讨论】:

  • 您无法根据选择数据的时间自动重新排序。您可以编写代码来进行重新排序,但您的应用需要在适当的时间触发该代码。
  • 正确。我已经设置了所有这些。我遇到的问题是触发的查询随机重新分配排序顺序,但保持该类别的顺序。

标签: mysql database random


【解决方案1】:
SET @row := 0;
UPDATE ItemsTable SET sort = (@row := @row + 1) WHERE cat_id = 1 ORDER BY RAND();

好的,经过几个小时的研究和尝试,这解决了我的问题。 它现在生成一个随机数字序列。

我知道 RAND() 效率不高,但这是另一天的另一个问题 :)

希望这对某人有所帮助。

【讨论】:

  • 对我来说似乎是一个合理的解决方案。您只需要确保此 UPDATE 脱机运行或以其他方式运行时不会阻止页面加载。否则每 n 次页面加载都会异常缓慢。
【解决方案2】:

这是你想要的吗?

order by cat_id, rand()

或者,您是否尝试两次获取结果集:

select item_id, cat_id, sort
from ((select t.*, 0 as whichgroup
       from t
      )
      union all
      (select t.*, 1 as whichgroup
       from t
      )
     ) t
order by cat_id, whichgroup,
         (case when whichgroup = 0 then sort
               else rand()
          end)

这会将每条记录输出两次,首先按“排序”顺序,然后随机输出。

根据您的评论,这可能是您想要的:

order by cat_id,
         (case when sort <= 1991 then sort else rand() end)

【讨论】:

  • 不,我的意思是一旦显示第 1991 个项目,整个表格就会重新排序,但新的排序值会保留到第 1991 个项目再次显示。
  • 在 SQL 中,表是无序的。查询结果是有序的。您能否重新表述您的问题以阐明您真正需要什么?
  • 基本上,我想保持表中记录的排序顺序,直到我的程序达到阈值。一旦达到该阈值(换句话说,显示项目 1521)。使用新的随机排序顺序更新表,该顺序将是静态的,直到达到下一个阈值,此时数据库再次重新排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2011-05-21
  • 2012-07-26
  • 2021-07-10
  • 2020-03-04
  • 2011-03-06
  • 2022-12-02
相关资源
最近更新 更多