Mysql 如何使用基于列的递增值更新记录
我有表格Mysql 如何使用基于列的递增值更新记录,mysql,sql,Mysql,Sql,我有表格页面 +--------------------------------+ | Pages | +--------------------------------+ | Name | Id | ParentId | Ordinal | |--------------------------------| | A | 1 | NULL | 0 | |--------------------------------
页面
+--------------------------------+
| Pages |
+--------------------------------+
| Name | Id | ParentId | Ordinal |
|--------------------------------|
| A | 1 | NULL | 0 |
|--------------------------------|
| B | 2 | 1 | 0 |
|--------------------------------|
| C | 3 | 1 | 0 |
|--------------------------------|
| D | 4 | 1 | 0 |
|--------------------------------|
| E | 5 | 2 | 0 |
|--------------------------------|
| F | 6 | 2 | 0 |
|--------------------------------|
| G | 7 | 3 | 0 |
|--------------------------------|
| H | 8 | 3 | 0 |
|--------------------------------|
| I | 9 | 3 | 0 |
+--------------------------------+
我想用SQL更新表,所以
+--------------------------------+
| Pages |
+--------------------------------+
| Name | Id | ParentId | Ordinal |
|--------------------------------|
| A | 1 | NULL | 0 |
|--------------------------------|
| B | 2 | 1 | 0 |
|--------------------------------|
| C | 3 | 1 | 1 |
|--------------------------------|
| D | 4 | 1 | 2 |
|--------------------------------|
| E | 5 | 2 | 0 |
|--------------------------------|
| F | 6 | 2 | 1 |
|--------------------------------|
| G | 7 | 3 | 0 |
|--------------------------------|
| H | 8 | 3 | 1 |
|--------------------------------|
| I | 9 | 3 | 2 |
+--------------------------------+
列Ordinal
必须是增量值,从0开始。
每次列
ParentId
更改时,它都应该重新开始。尝试此查询,因为它是显示行数
select *,b.row_number from page as a
join(SELECT @row_number:=@row_number+1 AS row_number,id,Parentid FROM page, (SELECT @row_number:=0) AS t
group by Parentid
ORDER BY id)as b on a.id=b.id
我解决它。下面是代码,以防有人感兴趣
SELECT
语句
SET @ordinal := -1;
SET @parent := (SELECT ParentId FROM Pages WHERE ParentId IS NULL);
SELECT p.Name, p.Id, p.ParentId, p.Ordinal
FROM (
SELECT p.Name
,p.Id
,p.ParentId
,CASE WHEN @parent != p.ParentId OR @parent IS NULL
THEN @ordinal:=0
ELSE @ordinal:=@ordinal+1 END
AS Ordinal
,@parent:=p.parentId
FROM Pages p
) p
ORDER BY p.ParentId, p.Ordinal;
SET @ordinal := -1;
SET @parent := (SELECT ParentId FROM Pages WHERE ParentId IS NULL);
UPDATE Pages p JOIN (
SELECT Id
,CASE WHEN @parent != ParentId OR @parent IS NULL
THEN @ordinal:=0
ELSE @ordinal:=@ordinal+1 END
AS Ordinal
,@parent:=ParentId
FROM Pages
) p1 ON p.id = p1.id
SET p.Ordinal = p1.Ordinal;
UPDATE
语句
SET @ordinal := -1;
SET @parent := (SELECT ParentId FROM Pages WHERE ParentId IS NULL);
SELECT p.Name, p.Id, p.ParentId, p.Ordinal
FROM (
SELECT p.Name
,p.Id
,p.ParentId
,CASE WHEN @parent != p.ParentId OR @parent IS NULL
THEN @ordinal:=0
ELSE @ordinal:=@ordinal+1 END
AS Ordinal
,@parent:=p.parentId
FROM Pages p
) p
ORDER BY p.ParentId, p.Ordinal;
SET @ordinal := -1;
SET @parent := (SELECT ParentId FROM Pages WHERE ParentId IS NULL);
UPDATE Pages p JOIN (
SELECT Id
,CASE WHEN @parent != ParentId OR @parent IS NULL
THEN @ordinal:=0
ELSE @ordinal:=@ordinal+1 END
AS Ordinal
,@parent:=ParentId
FROM Pages
) p1 ON p.id = p1.id
SET p.Ordinal = p1.Ordinal;
一个简单的答案
样本输出:
这是你的电话号码
希望这有帮助。什么是条件New_Ordinal->如何找到它?New_Ordinal是什么?请看序列是由(parentid,id)给定的,为什么要存储它?它不会在parentid每次更改时都从0开始,但无论如何还是要感谢。它帮助我开始。