我有一个名为userz
的下一个表格示例:
+----+---------------+----------+
| id | sort_position | type |
+----+---------------+----------+
| 1 | -5 | admin |
| 2 | -3 | customer |
| 3 | 1 | customer |
| 4 | 8 | employee |
| 5 | 200 | customer |
+----+---------------+----------+
使用Mysql
如果我想让所有sort_position
类型的customer
从0开始,++
直到满足WHERE
条件的最后一行,我可以做下一个:
SET @i=-1;
UPDATE userz
SET sort_position=@i:=@i+1
WHERE type = "customer" ORDER BY sort_position;
我将收到预期的结果:
+----+---------------+----------+
| id | sort_position | type |
+----+---------------+----------+
| 1 | -5 | admin |
| 2 | 0 | customer |
| 3 | 1 | customer |
| 4 | 8 | employee |
| 5 | 2 | customer |
+----+---------------+----------+
如您所见,现在为所有客户分配了正确的sort_position
0,1,2
但是因为我正在使用postgre,所以我需要与它相同。到目前为止我尝试了什么:
DO $$
DECLARE
i integer := -1;
BEGIN
UPDATE userz
SET sort_position=@i:=@i+1
WHERE type = "customer" ORDER BY sort_position;
END $$;
我在=@i:=@i+1
附近遇到错误,尝试了不同的格式,我用Google搜索了=i:=i+1
,但仍然没有运气。
答案 0 :(得分:0)
尝试以下SQL;
update userz k
set sort_position =
(select ROW_NUMBER() over(order by sort_position)-1 rnum
from userz src
where src.type ='customer'
and id = k.id)