使用随机排序更新MySQL表

使用随机排序更新MySQL表,mysql,database,random,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,下一次页面将显示条目s

我有一张这样的桌子

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,下一次页面将显示条目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
现在我的想法是,我必须编写一个脚本,选择cat_id=1随机排序结果的记录,然后我必须在PHP中创建一个循环,将数据库更新1001次。在我看来,这似乎没有效率


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

这能满足您的需求吗

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)
按类别id订购,

(排序时的情况)这是否符合您的要求

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)
按类别id订购,
(排序时的大小写)
好的,经过几个小时的研究和尝试,我的问题解决了。
它现在生成一个随机的数字序列

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

希望这对别人有帮助

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

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


希望这对其他人有所帮助。

不,我的意思是,一旦显示了第1991项,整个表都会重新排序,但新的排序值会一直保留到第1991项再次显示为止。在SQL中,表是无序的。查询结果是有序的。您能否重新表述您的问题,以澄清您真正需要的内容?基本上,我希望保留表中记录的排序顺序,直到程序中达到阈值为止。一旦达到该阈值(换句话说,显示项目1521)。使用新的随机排序顺序更新表,该顺序将是静态的,直到达到下一个阈值,此时数据库将重新排序。不,我的意思是,一旦显示第1991项,整个表将重新排序,但新的排序值将保留,直到再次显示第1991项。在SQL中,表是无序的。查询结果是有序的。您能否重新表述您的问题,以澄清您真正需要的内容?基本上,我希望保留表中记录的排序顺序,直到程序中达到阈值为止。一旦达到该阈值(换句话说,显示项目1521)。使用新的随机排序顺序更新表,该顺序将是静态的,直到达到下一个阈值,此时数据库将再次重新排序。您无法根据选择数据的时间自动重新排序。您可以编写代码进行重新排序,但您的应用程序需要在适当的时间触发该代码。正确。我已经准备好了。我遇到的问题是,查询会随机重新分配排序顺序,但会保持该类别的顺序。您无法根据选择数据的时间自动重新排序。您可以编写代码进行重新排序,但您的应用程序需要在适当的时间触发该代码。正确。我已经准备好了。我遇到的问题是,这个查询会随机重新分配排序顺序,但会保持该类别的顺序。对我来说,这似乎是一个合理的解决方案。您只需要确保此更新是脱机运行的,或者以其他方式运行,以便在运行时不会阻止页面加载。否则,每n个页面的加载速度都会异常缓慢。对我来说,这似乎是一个合理的解决方案。您只需要确保此更新是脱机运行的,或者以其他方式运行,以便在运行时不会阻止页面加载。否则,每n个页面的加载速度将异常缓慢。