查询以根据另一列中的值递增值

时间:2015-10-27 06:16:59

标签: mysql sql

我有一个包含以下架构+-------------------------+------------------+------+-----+-------------------+-----------------------------+ | 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 |

我无法为此编写查询。 请帮助。

2 个答案:

答案 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;

http://www.sqlfiddle.com/#!9/3f203/1