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;
我在实施这个时遇到了麻烦。 排名是用户可以随时更改的排名,可以随时添加和删除项目。问题是我希望排名是唯一的,并且总是在1和n之间排序(n是表中的行数)。 IE:如果用户将项目5的等级更改为2.先前的等级2项目应该变为等级3,先前的等级3变为等级4,并且先前的等级4变为新等级5.类似地,用于删除和创建,所有较大或较小的排名项目应该向下级联一个或相应的操作。
是否有某种模式或技术可以轻松实现这一点?
感谢您的帮助,
迈克尔
答案 0 :(得分:0)
您可以将商品保存在链接列表中:
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
在此设计中移动项目(甚至是一个项目块)只需要三次UPDATE
操作(您更改要移动的项目的父项,您要移动的项目的父项以及项目的项目正在搬离。
有关详细信息,请参阅我的博客中的这篇文章: