鉴于下表:
+--------+-------------------+-----------+
| ID | Name | Priority |
+--------+-------------------+-----------+
| 1 | Andy | 1 |
| 2 | Bob | 2 |
| 3 | David | 8 |
| 4 | Edward | 9 |
| 5 | CHARLES | 15 |
+--------+-------------------+-----------+
我想按优先级值将CHARLES
移动到Bob和David之间(忽略按字母顺序排列的列表,这只是为了使所需的结果显而易见)。
(另请注意,优先级值可能不是连续的)
要做到这一点,我需要将CHARLES的当前Priority
(15)更改为Bob的优先级+ 1,并将David和Edward的优先级更新为Priority+1
。
如果我知道两件事情,我可以 DO 这一点,CHARLES的ID和他必须遵循的行的优先级值(Bob):
UPDATE mytable SET Priority =
IF(ID = :charles_id, :bob_priority + 1,
IF(Priority >= :bob_priority,
Priority + 1, Priority))
问题或至少是问题,如何将结果值压缩为1,2,3,4,5而不是1,2,3,9,10 - 并且执行此操作一枪?
Oracle有一个“伪字段”,它是行的索引,但我不知道MySQL中的任何东西。
答案 0 :(得分:0)
问题的第一部分相当简单......
DROP TABLE IF EXISTS priorities;
CREATE TABLE priorities
(ID SERIAL PRIMARY KEY
,Name VARCHAR(12) NOT NULL
,Priority INT NOT NULL
,INDEX(priority)
);
INSERT INTO priorities VALUES
(101,'Andy',1),
(108,'Bob',2),
(113,'David',8),
(124,'Edward',9),
(155,'CHARLES',15);
UPDATE priorities a
JOIN
( SELECT x.id,x.name, @i:=@i+1 priority FROM priorities x, (SELECT @i:=0) vars ORDER BY id) b
ON b.id = a.id
SET a.priority = b.priority;
SELECT * FROM priorities
+-----+---------+----------+
| ID | Name | Priority |
+-----+---------+----------+
| 101 | Andy | 1 |
| 108 | Bob | 2 |
| 113 | David | 3 |
| 124 | Edward | 4 |
| 155 | CHARLES | 5 |
+-----+---------+----------+