CREATE TABLE item ( link MEDIUMINT UNSIGNED PRIMARY KEY NOT NULL,
title TEXT NOT NULL,
rank INT UNSIGNED NOT NULL AUTO_INCREMENT,
notes TEXT
) ENGINE = INNODB;
我在实现这个时遇到了问题。 rank 是用户给定的排名,可以随时更改,可以随时添加和删除项目。问题是我希望排名是唯一的,并且总是在 1 和 n 之间排序(n 是表中的行数)。 I.E.:如果用户将项目 5 的等级更改为 2。之前排名 2 的项目应变为等级 3,之前的等级 3 变为等级 4,之前的等级 4 变为新的等级 5。同样,对于删除和创建,所有更大或更小的排名项目应该向下级联或向上级联操作。
是否有某种模式或技术可以轻松实现这一点?
感谢您的帮助,
迈克尔
最佳答案
您可以将项目保存在链表中:
id parent title notes
1 0 Title 1 Note 1
2 1 Title 2 Note 2
3 2 Title 3 Note 3
4 3 Title 4 Note 4
然后像这样查询:
SELECT lv.*
FROM (
SELECT @r AS _parent,
@r := (
SELECT id
FROM t_list
WHERE parent = _parent
) AS id
FROM (
SELECT @r := 0
) vars,
t_list
) li
JOIN t_list lv
ON lv.id = li.id
在此设计中移动一个项目(甚至是一个项目 block )只需要三个 UPDATE
操作(您更改要移动的项目的父级、您要移动到的项目的父级和您要移动的项目)。
详情请看我博客中的这篇文章:
关于sql - MySQL维护顺序编号 "top n"列表的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1136516/