MySQL метод для поддержания последовательно нумерованного списка "top n" - PullRequest
2 голосов
/ 16 июля 2009
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 - это количество строк в таблице). IE: если пользователь меняет ранг элемента 5 на 2. Предыдущий элемент ранга 2 должен стать рангом 3, предыдущий ранг 3 переходит на ранг 4, а предыдущий ранг 4 становится новым рангом 5. Аналогично, для удаления и создания все элементы с большим или меньшим рейтингом должны каскадно опуститься на одну или более одну соответствующую операцию.

Существует ли какая-то модель или методика для простой реализации этого?

Спасибо за любую помощь,

Michael

1 Ответ

0 голосов
/ 16 июля 2009

Вы можете хранить свои товары в связанном списке:

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 операции (вы меняете родителей перемещаемого предмета, предмета, который вы перемещаете, и предмета, который вы перемещаете от).

См. Эту статью в моем блоге для деталей:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...