Создание связанного списка или аналогичной очереди в MySQL? - PullRequest
5 голосов
/ 23 июля 2010

У меня есть таблица элементов, которые должны отображаться в определенном порядке, но этот порядок можно изменить.Элементы могут быть добавлены в начале, конце или в середине, а элементы могут быть переставлены.Как настроить таблицу для отслеживания этого порядка таким образом, чтобы ее можно было легко изменить, но список можно также выбрать по порядку с помощью одного запроса?

Например, у меня может быть "NEXT_ID ", чтобы сделать это в стиле связанного списка, но тогда как мне выполнить запрос SELECT, чтобы получить строки в порядке цепочки NEXT_ID?отсутствует.

Ответы [ 5 ]

3 голосов
/ 23 июля 2010

Создать столбец в таблице, который представляет порядок сортировки.Поместите индекс в этот столбец, чтобы механизм MySQL мог быстро получать данные на основе этого столбца.Когда вы меняете порядок, обновите значения в этом поле для всех записей, чтобы сохранить его согласованность.

Например, когда вы вставляете новую запись в середине:

UPDATE table SET sort_order = sort_order + 1 WHERE sort_order >= 5;
INSERT INTO table (sort_order, column1, column2) VALUES (5, 'value1', 'value2');

Что-то ещесложный, как перемещение № 3 до № 6 и скольжение всех остальных вверх:

UPDATE table
SET sort_order = Case sort_order When 3 Then 6 Else sort_order - 1 End
WHERE sort_order BETWEEN 3 AND 6;
3 голосов
/ 23 июля 2010

Я часто сталкиваюсь с этой проблемой, и я решил ее с помощью простого решения: дополнительный столбец с именем Sort Order (или DisplayOrder, что бы на самом деле не плавало в вашей лодке). Это позволяет мне гибко использовать автоматически сгенерированный столбец идентификатора с автоматическим увеличением и иметь специальную предопределенную сортировку.

В моем случае мне нужно, чтобы они вышли из базы данных в алфавитном порядке, за исключением того, что некоторые элементы, такие как «Другое» и «Н / Д», всегда являются последними.

ProdID ProdText SortOrder
2      "Anchovies"    1
3      "Rivet"        2
4      "N/A"          4
5      "Other"        3

SELECT ProdID, ProdText ORDER BY Sort Order
2 голосов
/ 23 июля 2010

самое простое решение: использовать столбец с именем «display_order», в котором вы устанавливаете 1,2,3 и так далее.Запрос будет отсортирован с помощью "ORDER BY display_order".

Для редактирования этого (если вы находитесь в среде, связанной с веб-сайтом) используйте JavaScript, например, с кнопками + и -.каждый раз, когда вы делаете + увеличение числа, и если что-то с этим номером существует, оно будет уменьшаться, поэтому они меняют позиции.

2 голосов
/ 23 июля 2010

Если я неправильно понимаю, что вы ищете, может показаться, что вы можете просто добавить столбец DISPLAY_ORDER, который представляет собой числовой индекс того, как все должно быть возвращено.Это можно легко изменить и переставить.Плюс значение можно использовать по порядку.

1 голос
/ 23 июля 2010

Если вы хотите избежать порядка сортировки, вы можете попробовать «родительский» столбец и рассматривать связанный список как особый случай древовидной структуры. Эта статья может помочь.

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ (неработающая ссылка. Передана в Oracle ... извините).

Есть и другие статьи: http://ferdychristant.com/blog//archive/DOMM-7QJPM7

Имейте в виду, что выбор длинного связанного списка может снизить производительность.

...