MySQL переупорядочивает числовые значения

#mysql #database

#mysql #База данных

Вопрос:

У меня есть таблица со значениями

 ID(PK) MAIN_ID  SUB_ID
1         2        2
2         2        3
5         1        1
3         1        3
9         1        4
8         1        5
4         4        2
7         4        3
11        4        4
10        4        6
6         4        7
12        4        8
 

Я хочу изменить их порядок таким образом, чтобы идентификаторы MAIN_ID содержали 1, 2, 3, 4, а SUB_IDs содержали 1, 2, 3, 4, 5 и т.д. По сути, я хочу удалить недостающие числа и сделать так, чтобы MAIN_ID и SUB_ID следовали числовому порядку без пропущенных чисел

Желаемый результат по запросу

 ID(PK)  MAIN_ID           SUB_ID
1         2                1(Prev 2)
2         2                2(Prev 3)
5         1                1
3         1                2(Prev 3)
9         1                3(Prev 4)
8         1                4(Prev 5)
4         3(Prev 4)        1(Prev 2)
7         3(Prev 4)        2(Prev 3)
11        3(Prev 4)        3(Prev 4)
10        3(Prev 4)        4(Prev 6)
6         3(Prev 4)        5(Prev 7)
12        3(Prev 4)        6(Prev 8)
```
 

Комментарии:

1. Вы имеете в виду order by main_id, sub_id ?

2. Sub будет зависеть от количества значений. Это может быть 1-4, 1-6, 1-7, 1-8 и т.д. В зависимости от того, сколько подтем имеет sub. Он действует как подзаголовок к основному заголовку. и SubID используется для упорядочения подтем внутри каждого заголовка @Strawberry

3. Не приказываю. Я хочу изменить значения так, чтобы в них не было пропущенных значений. В случае заголовка 3 отсутствует @juergend

4. Пожалуйста, проверьте найденный вопрос @Strawberry

5. Основной идентификатор в вашем примере результата не содержит 1,2,3,4. Ваше объяснение нуждается в некоторой доработке.

Ответ №1:

Тебе это нужно:

 UPDATE test
JOIN ( SELECT ID, 
              DENSE_RANK() OVER (ORDER BY MAIN_ID) dr,
              ROW_NUMBER() OVER (PARTITION BY MAIN_ID ORDER BY SUB_ID, ID) rn
       FROM test ) t USING (ID)
SET test.MAIN_ID = dr, test.SUB_ID = rn;
 

?

скрипка