我有一个包含以下架构+-------------------------+------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+------------------+------+-----+-------------------+-----------------------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| parent_id | int(10) unsigned | NO | | NULL | |
| name | varchar(255) | NO | UNI | NULL | |
| disp1 | varchar(255) | NO | | NULL | |
| disp2 | varchar(255) | NO | | NULL | |
| created | timestamp | NO | | CURRENT_TIMESTAMP | |
| updated | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| node_e | tinyint(1) | YES | | 1 | |
| node_priority | int(5) | NO | | NULL | |
+-------------------------+------------------+------+-----+-------------------+-----------------------------+
的表格
我在查询下面运行以获得所需的数据:
select id,node_priority,parent_id from node where parent_id in (Select distinct parent_id from node as n) order by parent_id asc;
给出了以下输出:
+-----+---------------+-----------+
| id | node_priority | parent_id |
+-----+---------------+-----------+
| 17 | 0 | 2 |
| 18 | 0 | 2 |
| 19 | 0 | 2 |
| 20 | 0 | 2 |
| 21 | 0 | 2 |
| 216 | 0 | 3 |
| 23 | 0 | 22 |
| 24 | 0 | 22 |
| 25 | 0 | 22 |
| 26 | 0 | 22 |
| 27 | 0 | 22 |
| 29 | 0 | 28 |
| 30 | 0 | 28 |
| 31 | 0 | 28 |
| 32 | 0 | 28 |
| 33 | 0 | 28 |
| 35 | 0 | 34 |
| 36 | 0 | 34 |
| 37 | 0 | 34 |
| 38 | 0 | 34 |
| 39 | 0 | 34 |
| 40 | 0 | 34 |
| 41 | 0 | 34 |
| 42 | 0 | 34 |
| 44 | 0 | 43 |
| 45 | 0 | 43 |
| 46 | 0 | 43 |
| 47 | 0 | 43 |
| 48 | 0 | 43 |
| 49 | 0 | 43 |
| 50 | 0 | 43 |
| 51 | 0 | 43 |
| 58 | 0 | 52 |
| 60 | 0 | 52 |
| 66 | 0 | 52 |
| 77 | 0 | 52 |
| 95 | 0 | 52 |
| 96 | 0 | 52 |
| 106 | 0 | 52 |
| 117 | 0 | 52 |
| 128 | 0 | 52 |
| 137 | 0 | 52 |
| 141 | 0 | 52 |
| 164 | 0 | 52 |
| 55 | 0 | 53 |
| 56 | 0 | 53 |
| 57 | 0 | 53 |
| 59 | 0 | 58 |
| 61 | 0 | 60 |
| 62 | 0 | 60 |
| 63 | 0 | 60 |
| 64 | 0 | 60 |
| 65 | 0 | 60 |
| 67 | 0 | 66 |
| 68 | 0 | 66 |
| 72 | 0 | 66 |
| 73 | 0 | 66 |
| 74 | 0 | 66 |
我的主要目标:
我希望对于parent_id列的相同值,node_priority的值应该是从0到具有相同parent_id的行数的递增顺序。
以便输出如下:
+-----+---------------+-----------+
| id | node_priority | parent_id |
+-----+---------------+-----------+
| 17 | 0 | 2 |
| 18 | 1 | 2 |
| 19 | 2 | 2 |
| 20 | 3 | 2 |
| 21 | 4 | 2 |
| 216 | 0 | 3 |
| 23 | 0 | 22 |
| 24 | 1 | 22 |
| 25 | 2 | 22 |
| 26 | 3 | 22 |
| 27 | 4 | 22 |
| 29 | 0 | 28 |
| 30 | 1 | 28 |
| 31 | 2 | 28 |
| 32 | 3 | 28 |
| 33 | 4 | 28 |
| 35 | 0 | 34 |
| 36 | 1 | 34 |
我无法为此编写查询。 请帮助。
答案 0 :(得分:0)
您可以尝试以下代码:
SELECT ID,
ROW_NUMBER() OVER(PARTITION BY parent_id ORDER BY parent_id) - 1 AS node_priority,
parent_id
FROM (
SELECT id,parent_id
FROM node
WHERE parent_id in (SELECT DISTINCT parent_id
FROM node))
答案 1 :(得分:0)
在mysql中,您可以使用用户定义的变量
来实现此目的select
id,node_priority,parent_id
from (
select
id,
@rn:= if(@prev_parent = parent_id,@rn+1,0) as node_priority,
@prev_parent:= parent_id,
parent_id
from node,(select @prev_parent:=0,@rn:=0)x
order by parent_id
)x
另外
where parent_id in (Select distinct parent_id from node as n)
在上述查询中不需要。
要进行更新,您可以使用以下
update node n1
join (
select
id,
@rn:= if(@prev_parent = parent_id,@rn+1,0) as node_priority,
@prev_parent:= parent_id,
parent_id
from node,(select @prev_parent:=0,@rn:=0)x
order by parent_id,id
)n2 on n1.id = n2.id
set n1.node_priority = n2.node_priority;