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

Обновление/увеличение одного столбца на несколько строк одновременно

Я пытаюсь добавить строки в столбец, сохраняя order в последнем столбце, установленном в один, и все остальные строки, подсчитывающие оттуда.

В этом случае я добавляю новую строку с порядком = 0, а затем использую этот запрос для обновления всех строк на один.

"UPDATE favorits SET order = order+1"

Однако происходит то, что все строки обновляются до одного значения. Я получаю стек фаворитов, все с порядком 6, например, когда он должен быть одним с 1, следующим с 2 и т.д.

Как обновить эти строки таким образом, чтобы они упорядочивали их так, как они должны быть?

Спасибо,
~ Jordan

4b9b3361

Ответ 1

Что вы сообщаете БД, чтобы он обновлял КАЖДУЮ запись в таблице, увеличивая ее поле заказа на единицу. Таким образом, каждая запись всегда будет иметь такое же значение. Я верю, что вы пытаетесь установить самую последнюю запись в 1 и самую старую запись, установленную на (без записей + 1).

Так что, возможно, вы можете попробовать следующее:

set @count = (SELECT COUNT(ID) from favorits);
UPDATE favourits SET order = @count-ID+1

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

Итак, это будет подход:

set @i=0;
set @Count=(SELECT COUNT(*) from favorits);

UPDATE favorits SET `order` = @Count-(@i:[email protected]+1)+1;

Ответ 3

Я перешел, так что я придумал следующее решение. Рассмотрим следующую таблицу:

CREATE TABLE `placements` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `user` varchar(12) NOT NULL,
  `place` tinyint(3) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8; 

INSERT INTO `placements` (`id`, `user`, `place`) VALUES
(1, 'Adam', 1),
(2, 'Bill', 2),
(3, 'Carl', 3),
(4, 'Doug', 4),
(5, 'Eddy', 5),
(6, 'Frank', 6),
(7, 'George', 7),
(8, 'Harry', 8),
(9, 'Ian', 9),
(10, 'John', 10);

Итак, скажем, у вас есть Джон против Адама за место №1, и Джон побеждает:

UPDATE placements 
SET place = place +1 
WHERE user != "John";

UPDATE placements 
SET place = 1 
WHERE user = "John";
Джон на первом месте, и все остальные оказались на месте. Теперь позвольте сказать, что Джордж подходит к Карлу для позиции Карла (в настоящее время это место № 4). Джордж выигрывает: это значит, что Джордж теперь занял место №4, а Карл занял №5. Что происходит с прежней позицией Джорджа №8?
UPDATE placements 
SET place = place +1 
WHERE place > 3 
AND place < 9 
AND user != "George";

UPDATE placements 
SET place = 4 
WHERE user = "George";

Итак, это действительно не так сложно сделать. Вам просто нужно знать текущее размещение некоторых ваших пользователей и при необходимости корректировать свои MySQL-запросы.

Если вы вставляете эти запросы в свой терминал или phpMyAdmin (или все, что вы используете), и следуйте за ним, вы увидите, что он работает.