2011-03-05 8 views
22

열에 행을 추가하려고합니다. 가장 최근 열의 을 1로 설정하고 그 밖의 모든 행은 거기에서부터 세어 나갑니다.여러 행의 한 열을 한 번에 업데이트/증분

이 경우, order = 0 인 새 행을 추가 한 다음이 쿼리를 사용하여 모든 행을 하나씩 업데이트합니다.

"UPDATE favorits SET order = order+1" 

그러나 모든 행이 동일한 값으로 업데이트됩니다. 즐겨 찾기 스택을 얻습니다. 예를 들어 모두 순서 6으로, 1은 1, 2는 다음과 같이되어야합니다.

이러한 순서로 행을 업데이트하는 방법은 무엇입니까?

감사합니다,
~ 요르단 당신이 하나의 순서 필드를 증가하여 테이블의 모든 레코드를 업데이트 할 DB를 말하는 무엇

+0

귀하의 질의어는 좋아 보이며 독립적으로 의도 된대로 동작해야합니다. –

+0

일요일 가장 기괴한. 그것은 ** 정확한 ** 쿼리입니까, 아니면 그것에'WHERE' 절이 있습니까? 어떻게 그걸하고 있니? 반드시 여러 번 실행해야합니까? 테이블에 물건을 방해 할 수있는 트리거가 있습니까? 또한 귀하의 쿼리는 확실히 'UPDATE favorits SET order = @ order + 1' 또는 뭐가 아닌가요? –

+0

뒤로 점진? 그냥 이해하려고 애를 썼어요 ... – Orbit

답변

21

. 그래서 모든 레코드는 항상 같은 값을 갖습니다. 나는 최신 기록을 1로 설정하려고 시도하고 가장 오래된 기록을 (기록 없음 +1)으로 설정하려고합니다.

그래서 어쩌면 당신이 시도 할 수 있습니다 :

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

을 지금이 레코드가 삭제되지 않습니다 가정한다. 이 경우이를 조정하고 최신 레코드를 1로 설정 한 다음 ID별로 정렬 된 각 이전 레코드의 순서 값을 증가시켜야합니다.

그래서이는 방법이 될 것입니다 :

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

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

내가 intereted 가지고, 그래서 나는 다음과 같은 솔루션을 함께했다. 다음 표 고려 : 그래서

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"; 

요한은 처음부터 지금과 다른 사람이었다 위치를 뒤엎었다. 이제 George가 Carl의 직위를 위해 Carl을 상대로 올라간다 고 말할 수 있습니다 (현재 배치 # 4). George가 승리합니다. George가 이제 4 위, Carl 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 (또는 무엇을 사용하든)에 붙여넣고 따라하면 따라 할 수 있습니다.

관련 문제