2012-08-07 119 views
1

我有一个表像这样更新MySQL表随着随机排序

ItemsTable 

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

在我的程序,页面显示每一次,它会拉动基础上的排序号的下一个项目。所以,比如说我只显示了排序= 2,下一次页面将显示项目排序= 3(也许排序是一个坏名字)。

我想要做的是,一旦我拉最后一项(排序= 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做这件事最有效的方法是什么?

+0

根据何时选择数据,您无法自动执行重新排序。您可以编写代码来进行重新排序,但是您的应用程序需要在适当的时候触发该代码。 – MatBailie 2012-08-07 19:13:30

+0

正确。我已经完成了所有这些工作。我遇到的问题是随机重新分配排序顺序的查询,但保持该顺序。 – Hugo 2012-08-07 19:15:04

回答

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) 
+0

不,我的意思是说,一旦显示了1991年的项目,整个表格就会被使用,但是新的排序值会一直存在,直到第1991个项目再次出现。 – Hugo 2012-08-07 19:01:21

+0

在SQL中,表格是无序的。查询结果是有序的。你能否重新解释你的问题来澄清你真正需要的东西? – 2012-08-07 19:03:01

+0

基本上,我想保留表中记录的排序顺序,直到我的程序中达到阈值。一旦达到该阈值(换句话说,显示项目1521)。使用新的随机排序顺序更新表,该排序顺序将保持静态,直到达到下一个阈值,此时数据库会再次重新排序。 – Hugo 2012-08-07 19:05:44

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

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

我知道RAND()是不是很有效,但这是另一天:)

希望另一个问题这可以帮助别人。

+0

似乎对我来说是一个合理的解决方案。您只需确保此UPDATE脱机运行或以其他方式运行时不会阻止页面加载。否则,每n个页面加载将会非常慢。 – dimo414 2012-08-07 20:31:33