2010-07-22 2 views
4

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

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

Извинитесь за сверх очевидное решение. Возможно, я пропал без вести.

+1

См. [Получение связанного списка в базе данных MySQL] (http://stackoverflow.com/questions/675117/fetching-linked-list-in-mysql-database). Как уже отмечалось, это особый случай дерева. Невозможно написать запрос MySQL, который извлекает все строки. –

ответ

3

У меня эта проблема часто, и я решил ее с помощью простого решения: дополнительный столбец под названием Order 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

Ну, я надеюсь на что-то, где мне не нужно обновлять все/несколько записей за один ход или вставку.Но, основываясь на ответах ниже, возможно, этого не существует в MySQL. – NChase

+0

@NChase: Я еще не нашел такую ​​функциональность в SQL –

2

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

+0

Я надеялся на что-то, где мне нужно было бы только обновлять записи, которые перемещаются/вставляются, а не каскадировать изменение через весь sortOrder, но это звучит как это может быть невозможно. – NChase

+1

Ну, это не обязательно через всех. Это влияет только на записи между диапазоном, который изменяется. Например, если вы перемещаете запись с индексом 3 до 7, вы должны обновлять записи только между 3 и 7. Нет необходимости ничего менять. – spinon

2

Создать столбец в таблице, которая представляет порядок сортировки. Поместите индекс в этот столбец, чтобы двигатель 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; 
1

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

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

1

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

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

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

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

+0

Ссылка мертва –

+0

Спасибо за указание. Я сообщил о неработающей ссылке через сайт mysql. Я не надеюсь услышать от Oracle об этом. –

Смежные вопросы