我需要创建一个自动从1开始递增的列(但是有多少行)。但是,我需要根据我的概率列的顺序对该列进行重新排序。有可能吗?
答案 0 :(得分:0)
我通常建议不要将这种排序计算实现为显式表字段。随着表的增长,使此类信息保持最新状态将产生越来越大的开销。相反,您可以只按ORDER BY您的概率列;或者,如果您确实需要查询结果中的“排名”,则可以通过多种方法来执行此操作,例如:
SELECT @seq := seq + 1, d.*
FROM theRealData AS d, (SELECT @seq := 0) AS init
ORDER BY theRealData.probability
;
我在下面的注释中提到的存储过程的伪代码(我在写这篇文章时没有在寻找确切的语法,所以可能有些事情我忽略了)(如果我的顺序颠倒了,可能需要调整。) )
CREATE PROCEDURE theProc (newID INT)
BEGIN
DECLARE newProb INT; //Not sure if it is int, but for the sake of example
DECLARE seqAt INT;
SET newProb = SELECT probability FROM theTable WHERE ID = newID;
SET seqAt = SELECT IFNULL(min(seq), 1) FROM theTable WHERE probability > newProb;
UPDATE theTable SET seq = seq + 1 WHERE seq >= seqAt;
UPDATE theTable SET seq = seqAt WHERE ID = newID;
END
如果传递所有插入的字段,而不只是插入新行后的ID,则该过程可以自行插入并使用last_insert_id()完成其余工作。
答案 1 :(得分:0)
修改主键值可能会变得非常昂贵,特别是如果您有指向它的相关表时。
如果您需要按概率保持顺序,建议您在Video
后面增加一列。您可以在每次插入后或每分钟,每小时或每天更新一次此列。
或者,就像@Uueerdo所说的那样,您可以在查询表行时使用probability_order
。