Как запросом перемешать числа?

Есть, например, у меня таблица с чем-то, например с товарами. У каждого товара есть поле (INT) `position`. Товаров 300, соответсвенно, это поле не повтораяется, у каждого товара есть своя позиция.

Как мне запросом позиции перемешать? Ну или не запросом. Подскажите самый красивый вариант реализации
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ответы на вопрос 3
idShura
@idShura
select * from MyTable ORDER BY RAND()
Ответ написан
Комментировать
BuriK666
@BuriK666
Компьютерный псих
BEGIN;
SET @position := 0; 
// Если position UNIQUE
SELECT  @max_pos := max(position) FROM product;
UPDATE product SET position = @max_pos + position;
// 
UPDATE product SET position = (@position := @position+1) ORDER BY RAND(); 
COMMIT;
Ответ написан
Комментировать
LaRN
@LaRN
Senior Developer
Если это разовая акция, то просто UPDATE решает задачу, но если это будет требоваться делать периодитчески, то можно создать отдельную таблицу c полями position и newposition и сохранить в нее для каждого значения position из исходной таблицы новое значение newposition.
А далее в запросах джойнить две таблицы.
Если в созданной таблице сделать первичный ключ по position, то джойн будет очень быстрым.

Плюсы такого решения:
Таблица product не блокируется (UPDATE накладывает блокировки, кроме этого каждый апдейтв - это запись в журнале транзакций, что тоже не бесплатно)

Не происходит перестроения индексов в которые входит поле position (если таблица product большая - это существенно может сказаться на производительности)

Не происходит деградации статистики по полю position, если по этому полю плохая статистика оптимизатор не сможет построить хороший запрос.

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

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

Из минусов:
Нужно поддерживать еще одну таблицу.
Нужно переписать запросы - добавить джой.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы