如何使用基于列的递增值更新记录

时间:2015-11-20 11:58:05

标签: mysql sql

我有表Pages

+--------------------------------+
|            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每次更改时重新开始。

3 个答案:

答案 0 :(得分:1)

简化答案。

示例输出:enter image description here 这是SQLFiddle Demo

SELECT Name,Id,ParentId,Ordinal
FROM
(SELECT `Name`,
        `Id`,
        `ParentId`,
        (@category_num :=IF(ParentId = @ParentId,@category_num+1,0)) AS Ordinal,
        @ParentId:= `ParentId` AS Temp_swap

FROM Pages)T

希望这有帮助。

答案 1 :(得分:0)

尝试此查询显示rownumber

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

答案 2 :(得分:0)

我解决了。以下是代码,以防有人感兴趣

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;

UPDATE声明

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;