MySQL方法保持按顺序编号的“前n个”列表

时间:2009-07-16 09:45:44

标签: sql mysql

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.类似地,用于删除和创建,所有较大或较小的排名项目应该向下级联一个或相应的操作。

是否有某种模式或技术可以轻松实现这一点?

感谢您的帮助,

迈克尔

1 个答案:

答案 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操作(您更改要移动的项目的父项,您要移动的项目的父项以及项目的项目正在搬离。

有关详细信息,请参阅我的博客中的这篇文章: