sql - MySQL维护顺序编号 "top n"列表的方法

标签 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;

我在实现这个时遇到了问题。 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/

相关文章:

mysql - 如何根据不同类别的分数将 "rank"列添加到mysql表中?

mysql - 将 varchar 转换为日期并按转换后的 varchar 排序

java - 如何注释 Hibernate 实体以同时支持 Java 和数据模型?

android - 如何在android服务中发送通知?

mysql 错误说我有语法错误,但我不明白错误消息

c# - 由于 : Unable to load one or more of the requested types. 导致无法导出检索 LoaderExceptions 属性以获取更多信息。

mysql - 主键中的 DATE 会在范围扫描中获得性能吗?

sql - 在 MySql 中对 UNION 结果求和的简单方法

mysql - 按缺少值过滤结果

php - Ruby on Rails 与 MySQL、PHP 和 javascript 方法有何不同?