我正在尝试向列中添加行,将最新列的order
设置为1,并将所有其他行从那里开始计数。
在这种情况下,我添加一个order = 0的新行,然后使用此查询将所有行更新为一个。
"UPDATE favorits SET order = order+1"
但是,所发生的是所有行都更新为相同的值。我得到了一堆收藏夹,例如订单6,当它应该是1和1时,下一个是2,依此类推。
如何以按照应有的方式对这些行进行排序来更新这些行?
谢谢,
〜约旦
答案 0 :(得分:42)
SET @a = 0;
UPDATE favorits SET order = @a:=@a+1;
答案 1 :(得分:21)
您告诉数据库做什么通过将其顺序字段递增1来更新表中的每条记录。所以每条记录总是具有相同的价值。我相信你正试图将最新记录设置为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:=@i+1)+1;
答案 2 :(得分:0)
我是白色的,所以我提出了以下解决方案。请考虑下表:
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);
所以,让我们说约翰对阵亚当的比赛是第一名,约翰获胜:
UPDATE placements
SET place = place +1
WHERE user != "John";
UPDATE placements
SET place = 1
WHERE user = "John";
约翰现在处于第一位,其他所有人都被撞倒了。现在让我们说乔治在卡尔的位置(目前排名第4位)对阵卡尔。乔治获胜:这意味着乔治现在排名第4,卡尔排名第5。 Georges旧职位#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(或您使用的任何内容),并按照这些查询,您将看到它有效。