2015-10-27 5 views
0

У меня есть таблица с ниже схемой +-------------------------+------------------+------+-----+-------------------+-----------------------------+ | 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

можно использовать row_number() OVER (ORDER BY (SELECT ***)), чтобы получить свой результат – PK20

ответ

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

+0

Привет, цель состоит в том, чтобы обновите столбец node_priority в соответствии с приведенными выше значениями. – GP007

+0

Да, приведенный выше запрос покажет node_priority в инкрементном порядке для каждого parent_id и с небольшими изменениями он может быть записан как запрос на обновление. Сначала проверьте, возвращает ли приведенный выше запрос ожидаемый результат. Вы можете изменить порядок как «order by parent_id, id», так что для каждого parent_id он также выполнит порядок для id –

+0

Да, запрос возвращает желаемый результат. и запрос возвращает результат, отсортированный по id по умолчанию. – GP007

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)) 
Смежные вопросы