MySQL重新排序行优先级字段值,并使它们顺序

时间:2018-02-15 12:14:22

标签: mysql

鉴于下表:

+--------+-------------------+-----------+
| 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中的任何东西。

1 个答案:

答案 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 |
+-----+---------+----------+