Подтвердить что ты не робот

Как изменить порядок строк в базе данных sql

Можно ли изменить порядок строк в базе данных SQL? Например; как я могу поменять порядок значений 2-й строки и 3-й строки?

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


Спасибо за все ответы. Но "Order by" не будет работать для меня.

Например, я поместил список закладок в базу данных. Я хочу отображать на основе результата, полученного из запроса. (не в алфавитном порядке). Просто когда они вставлены.

Но пользователь может изменить расположение закладки (каким-либо образом он хочет). Поэтому я не могу использовать "порядок".

Примером может служить то, как закладка отображается в закладке в Firefox. Пользователь может легко переключаться. Как я могу упомянуть, что в БД?

Спасибо.

4b9b3361

Ответ 1

Похоже, вам нужен другой столбец типа "ListOrder". Таким образом, ваш стол может выглядеть так:

BookMark ListOrder
======== =========
  d        1
  g        2
  b        3
  f        4
  a        5

Затем вы можете "заказать по" ListOrder.

Select * from MyTable Order By ListOrder

Если пользователь может перемещать только закладку по одному месту за раз, вы можете использовать целые числа в качестве ListOrder и обменивать их. Например, если пользователь хочет переместить "f" на одну строку:

Update MyTable
    Set ListOrder=ListOrder+1
        Where ListOrder=(Select ListOrder-1 From MyTable where BookMark='f')

Update MyTable
    Set ListOrder=ListOrder-1
        Where BookMark='f'

Если пользователь может перемещать закладки вверх или вниз по нескольким строкам одновременно, вам необходимо изменить порядок сегментов. Например, если пользователь хочет переместить "f" в начало списка, вам необходимо:

update MyTable
    Set ListOrder=ListOrder+1
        where ListOrder>=1 -- The New position
            and ListOrder <(Select ListOrder from MyTable where BookMark='f')

 update MyTable
     Set ListOrder=1 -- The New Position
         Where Bookmark='f'

Ответ 2

Как отмечали другие, не следует полагаться на физический порядок таблицы базы данных. Реляционные таблицы концептуально больше напоминают неупорядоченные множества, чем упорядоченные списки. Если предположить, что определенный физический порядок может привести к непредсказуемым результатам.

Похоже, что вам нужен отдельный столбец, в котором хранится предпочтительный порядок сортировки пользователя. Но вам все равно нужно что-то сделать в вашем запросе, чтобы отобразить результаты в этом порядке.

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

Ответ 3

Используйте ORDER BY в вашем запросе SELECT. Например, чтобы заказать по фамилии пользователя, используйте:

SELECT * FROM User ORDER BY LastName

Ответ 4

Порядок строк в реальной базе данных не должен иметь значения.

Вы должны использовать ORDER BY в своих запросах, чтобы заказать их по мере необходимости.

Ответ 5

Базы данных могут хранить данные любым способом. Использование предложения "по порядку" - это только способ гарантировать упорядочение данных. В примере с закладкой вы можете иметь целое поле, которое указывает порядок, а затем обновлять это поле, когда пользователь перемещает вещи. Затем ЗАПИСЬ В этом столбце, чтобы получить информацию в правильном порядке.

Ответ 6

Я предполагаю, что простой order by будет тем, что вы ищете?

select my_column from my_table order by my_order_column;

Ответ 7

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

Ответ 8

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

Короче говоря, я делаю следующее:

  • добавить поле sort_order в таблицу элементов
  • при вставке новой строки, я устанавливаю sort_order = id
  • при переупорядочении (требуется идентификатор элемента для перемещения и идентификатор элемента для вставки после):
    • выберите id, sort_order из элементов, где container = ID order by sort_order
    • разделяет идентификатор и sort_order из строк в двух массивах
    • удалить идентификатор элемента для перемещения из списка id
    • вставить идентификатор элемента для перемещения после идентификатора элемента, который нужно вставить после
    • объединить список идентификаторов и список sort_order в двухмерный массив, как [[id, sort_order], [id2, sort_order], ...]
    • запустить update item set sort_order=SORT_ORDER where id=ID (executemany) с объединенным списком

(Если перемещение элемента в другой контейнер после обновления "внешнего ключа контейнера" перемещается первым или последним в зависимости от приложения.)

(Если обновление связано с большим количеством элементов, я не думаю, что это решение является хорошим подходом.)

Я сделал пример, используя python и mysql на http://wannapy.blogspot.com/2010/11/reorder-rows-in-sql-database.html (скопируйте и попробуйте) вместе с некоторыми дополнительными пояснениями.

Ответ 9

В ответ на ваше сообщение здесь ответ, который вы, возможно, ищете, это:

Чтобы заказать хронологически, добавьте DateAdded или аналогичный столбец с типом datetime или smalldatetime.

Во всех методах, которые вставляются в базу данных, убедитесь, что вы вставляете CURRENT_TIMESTAMP в столбец DateAdded.

В методах, которые запрашивают базу данных, добавьте ORDER BY DateAdded в конец строки запроса.

НИКОГДА не полагайтесь на физическое положение в системе базы данных. Он может работать MOST того времени, но определенно не ВСЕ из времени.

Ответ 10

Во-первых, позвольте мне согласиться со всеми здесь, что порядок в таблице не имеет значения. Используйте отдельный столбец [SortOrder], который вы обновляете, и включаете предложение Order By.

Тем не менее, базы данных SQL Server допускают единый "кластеризованный индекс" в таблице, который фактически заставит позицию в базовом хранилище таблиц. В первую очередь полезно, если у вас есть большой набор данных и всегда запрашивает что-то конкретное.

Ответ 11

В этом вопросе отсутствуют какие-либо детали, которые позволили бы вам дать правильный ответ. Ясно, что вы могли читать записи в памяти, а затем обновлять их. Но это плохо на разных уровнях.

Проблема такая. В зависимости от фактически реализованной схемы существует логика, согласно которой записи физически записываются на диск. Иногда они записываются в порядке вставки и в другое время, когда они вставлены с пробелом между блоками (см. Экстенты).

Таким образом, изменение физического порядка вряд ли произойдет без обмена данными столбцов; и это оказывает глубокое влияние на различные индексы. Вам остается изменить логический порядок.

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

Но для получения полного решения недостаточно информации.

Ответ 12

Добавьте столбец position в таблицу и сохраните как простое целое число.

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

  • закладки: id,url
  • пользователи: id,name
  • users_bookmarks: user_id, bookmark_id, position, date_created

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

select bookmark_id from users_bookmarks where user_id = 1 order by position, date_created;

Ответ 13

Вот хранимый сценарий продолжения для увеличения или уменьшения (по одному) в MySQL

Обратите внимание, что MySQL не позволяет вам выбирать в том же запросе, который вы обновляете, поэтому приведенные выше ответы не работают.

Я также установил его, чтобы он возвращал ошибку, если нет элемента выше/ниже, если вы увеличиваете/уменьшаете соответственно.

DELIMITER $$
CREATE PROCEDURE 'spReorderSequenceItems' (
  IN _SequenceItemId INT,
  IN _SequenceId INT,
  IN IncrementUp TINYINT,
  OUT Error VARCHAR(255)
)

BEGIN
  DECLARE CurrentPosition INT;

  SELECT Position INTO CurrentPosition
  FROM tblSequenceItems
  WHERE SequenceItemId = _SequenceItemId;

  IF IncrementUp = 1 THEN
    IF (
      SELECT Position
      FROM tblSequenceItems 
      WHERE Position = CurrentPosition + 1 AND SequenceId = _SequenceId
    ) THEN
      UPDATE tblSequenceItems
        SET Position = Position - 1
        WHERE Position = CurrentPosition + 1 AND SequenceId = _SequenceId;
      UPDATE tblSequenceItems
        SET Position = Position + 1
        WHERE SequenceItemId = _SequenceItemId;
    ELSE 
      SELECT 'No Item Above' AS _Error INTO Error;
    END IF;
  ELSE
    IF (
      SELECT Position
      FROM tblSequenceItems 
      WHERE Position = CurrentPosition - 1 AND SequenceId = _SequenceId
    ) THEN
      UPDATE tblSequenceItems
        SET Position = Position + 1
        WHERE Position = CurrentPosition - 1 AND SequenceId = _SequenceId;
      UPDATE tblSequenceItems
        SET Position = Position - 1
        WHERE SequenceItemId = _SequenceItemId;
    ELSE
      SELECT 'No Item Below' AS _Error INTO Error;
    END IF;
  END IF;
END
$$
DELIMITER ;

Позвони с

CALL spReorderSequenceItems(1, 1, 1, @Error);
SELECT @Error;

Ответ 14

В такие моменты мне напоминают цитату из "Матрицы": "Не пытайтесь упорядочить базу данных. Это невозможно. Вместо этого нужно только осознать истину... порядка нет. Тогда вы увидите, что это таблица, которая заказывает сам, это вы заказываете стол.

При работе с MySQL через графический интерфейс всегда принимается решение. Если вы запускаете что-то вроде SELECT * FROM users, MySql всегда будет принимать решение упорядочить это по некоторому полю. Обычно это будет первичный ключ.

+----------------
| id | name     |
-----------------
| 1  | Brian    |
| 2  | Carl     |
| 3  | Albert   |
-----------------

Когда вы добавляете в запрос команду ORDER BY, она примет решение упорядочить по какому-либо другому полю.

Например, Select * From users ORDER BY name даст:

+----------------
| id | name     |
-----------------
| 3  | Albert   |
| 1  | Brian    |
| 2  | Carl     |
-----------------

Итак, на ваш вопрос вы, похоже, хотите изменить порядок по умолчанию, в соответствии с которым ваша таблица отображает эту информацию. Для этого проверьте, в каком поле находится ваш первичный ключ. Для большинства практических целей наличие уникального идентифицирующего натурального числа имеет тенденцию добиваться цели. MySQL имеет функцию AUTO_INCREMENT для этого. При создании таблицы она будет выглядеть примерно так: field_name int NOT NULL AUTO_INCREMENT.

Все это означает: если вы хотите изменить "порядок строк", вам нужно обновить это значение. Однако, поскольку идентификатор - это то, что другие таблицы будут использовать для ссылки на ваше поле, это выглядит немного безрассудно.

Если вы, например, пошли: UPDATE table Set id = 1 where id = 2; изначально это не получится, поскольку поля id будут в конечном итоге идентичными и не пройдут проверку PrimaryKey (которая требует как уникальности, так и наличия установленного значения). Вы можете манипулировать этим, запустив три оператора обновления подряд:

UPDATE users Set id = 100000000 where id = 1;
UPDATE users Set id = 1 where id = 2;
UPDATE users Set id = 2 where id = 100000000;

Это приведет к тому, что строки для этой таблицы будут выглядеть так:

+----------------
| id | name     |
-----------------
| 1  | Carl     |
| 2  | Brian    |
| 3  | Albert   |
----------------+

Что технически будет работать, чтобы переупорядочить эту таблицу, но это в пузыре. MySQL, являющийся реляционной базой данных, означает, что любая таблица, которая в зависимости от этих данных была непротиворечивой, теперь будет указывать на неправильные данные. Например, у меня есть таблица, в которой хранятся дни рождения, ссылающиеся на исходную таблицу пользователей. Структура может выглядеть так:

+----------------------------+
| id | user_id  | birthdate  |
+----------------------------+
| 1  | 1        | 1993-01-01 |
| 1  | 2        | 1980-02-03 |
| 1  | 3        | 1955-01-01 |
+----------------------------+

Переключая идентификатор в пользовательской таблице, вы ДОЛЖНЫ обновить значение user_id в таблице дней рождения. Конечно, MySQL готовится к этому: введите " Ограничения внешнего ключа ". Пока вы сконфигурировали все ограничения внешнего ключа для Cascade Updates, вам не нужно будет вручную изменять ссылку на каждое значение, которое вы изменили.

Эти запросы будут много ручной работы и потенциально могут ослабить вашу целостность данных. Если у вас есть поля, которые вы хотели бы регулярно ранжировать и переупорядочивать, ответ Майка Льюиса на этот вопрос с "табличным порядком" был бы более разумным ответом (и если это так, то это его лучшее решение и просто не обращайте внимания на этот ответ).

Ответ 15

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

Ответ 16

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

  • Откройте схему базы данных/базу данных с помощью редактора toad
  • Экспортируйте желаемую таблицу в формате excel с помощью опции экспорта toad
  • Сделайте все изменения, которые вы хотите сделать в экспортированном excel. Это довольно просто изменить порядок строк в excel.
  • Сохранить excel и импортировать его в таблицу с помощью опции импорта toad.

get toad: http://www.quest.com/toad-for-mysql/