Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用基于列的递增值更新记录_Mysql_Sql - Fatal编程技术网

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开始,但无论如何还是要感谢。它帮助我开始。