使用随机排序更新MySQL表

时间:2012-08-07 18:57:24

标签: mysql database random

我有一张这样的表

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是一个坏名字)。

我想要做的是,一旦我拉出最后一项(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执行此操作的最有效方法是什么?

2 个答案:

答案 0 :(得分:1)

SET @row := 0;
UPDATE ItemsTable SET sort = (@row := @row + 1) WHERE cat_id = 1 ORDER BY RAND();

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

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

希望这有助于某人。

答案 1 :(得分:0)

这样做你想要的吗?

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)