1

我有一张这样的桌子

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 执行此操作的最有效方法是什么?

4

2 回答 2

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

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

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

希望这可以帮助某人。

于 2012-08-07T20:25:09.493 回答
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)
于 2012-08-07T18:59:02.300 回答