#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;
?