我有表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
每次更改时重新开始。
答案 0 :(得分:1)
简化答案。
示例输出: 这是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;