我有一张这样的表
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执行此操作的最有效方法是什么?
答案 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)