2011-03-05 74 views
22

我試圖將行添加到列中,並將最新列的order設置爲1,並將所有其他行從上往上計數。更新/一次增加多個行上的單個列

在這種情況下,我添加了order = 0的新行,然後使用此查詢將所有行更新爲1。

"UPDATE favorits SET order = order+1" 

但是,會發生什麼是所有行都更新爲相同的值。例如,我得到了一堆收藏,所有訂單都是6,例如,它應該是1,而下一個是2,等等。

我該如何更新這些行,以便按照它們應該的方式對它們進行排序?

感謝,
〜喬丹

+0

您的查詢看起來不錯,應該按照預期孤立地工作。 – 2011-03-05 22:43:36

+0

Sunds最離奇。這是你的**精確**查詢還是你有一個'WHERE'子句?你如何執行它?它肯定會執行多次?桌子上是否有觸發器可能會干擾事物?另外你的查詢絕對不是'UPDATE favorits SET order = @ order + 1'什麼的? – 2011-03-05 22:43:42

+0

向後遞增?只是想明白... – Orbit 2011-03-05 22:43:53

回答

21

您告訴DB做什麼它通過一個遞增的順序字段更新表中的每一記錄。所以每條記錄都會有相同的值。我相信你試圖將最新記錄設置爲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"; 

約翰是排在首位,而其他人是撞倒了一個位置。現在讓我們來說說喬治與卡爾一起對卡爾的位置(當前位置#4)。喬治獲勝:這意味着喬治現在排名第四,卡爾排名第五。 #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(或任何您使用的)中,然後按照步驟操作,您將看到它的工作原理。