2016-08-24 2 views
-1

У меня есть таблица, которая имеет столбец sort_no, а значения сортировки принадлежат q_id, что соответствует идентификатору вопроса. Но он не включает правильные значения сортировки. Иногда номера сортировки повторяются для разных записей с тем же q_id. Я должен реорганизовать эту таблицу с уникальными номерами сортировки для каждого вопроса.переупорядочить таблицу на основе столбца сортировки и другого значения столбца

Это образец данных у меня уже есть:

id | name | sort_no | q_id 
------------------------------- 
1 | val_1 | 1 | 21 
2 | val_2 | 2 | 21 
3 | val_3 | 1 | 32 
4 | val_4 | 3 | 21 
5 | val_5 | 2 | 32 
6 | val_6 | 2 | 32 
7 | val_7 | 1 | 25 
8 | val_8 | 1 | 21 
9 | val_9 | 1 | 21 
------------------------------- 

Это то, что должно быть:

id | name | sort_no | q_id 
------------------------------ 
1 | val_1 | 1 | 21 
2 | val_2 | 2 | 21 
3 | val_3 | 1 | 32 
4 | val_4 | 3 | 21 
5 | val_5 | 2 | 32 
6 | val_6 | 3 | 32 
7 | val_7 | 1 | 25 
8 | val_8 | 4 | 21 
9 | val_9 | 5 | 21 
------------------------------- 

На самом деле, я могу принести записи и поместить их в петлю и обновлять его по петле. Но, как вы знаете, это требует времени и ресурсов. Стол огромный с миллионами записей.

Мне было интересно, могу ли я сделать это непосредственно в MySQL с помощью вложенного запроса.

Я понятия не имею о запросе.

У кого-нибудь это было раньше?

+0

я думаю, что вы опубликовали ту же таблицу дважды. – boroboris

+0

@boroboris, nope. посмотрите на sort_no – Mojtaba

ответ

1
update test5 
    set [email protected]:=if(@grp=q_id,@srt+1,1), 
     [email protected]:=q_id 
where (0,0)=(select @grp:=0,@srt:=0) 
order by q_id, `name` 

Установить необходимый 'заказать по'. Первый столбец в 'order by' должен быть "q_id".

ПРИМЕЧАНИЕ: перед выполнением этого запроса, безопасный режим обновления следует отключить (если не по умолчанию):

SET SQL_SAFE_UPDATES = 0; 
+0

Отличная работа. – Mojtaba

0

ORDER BY не обязательно должно быть просто полем или списком полей. это могут быть и произвольные выражения, например.

ORDER BY foo = 42 DESC, foo 

поставит все записи с 42, а затем и все остальные в обычном порядке нумерации.

Если вы можете придумать какое-то выражение, которое вычисляет значение, которое соответствует вашему нужному порядку сортировки, а затем ...

ORDER BY somefunc(...) 

также будет работать. Важно то, что функция возвращает значение, которое БД будет использовать для фактической сортировки.

+0

Я хочу управлять текущими данными, чтобы быть тем, что я хочу. Я ничего не выбираю. – Mojtaba

+0

на любом другом db, который поддерживает функции окон, это будет относительно легко сделать, но у mysql их нет, вы застреваете ими в клиентском коде, и вам просто придется укусить пулю и начать цикл по наборам записей –

+0

Да. Это то, что я собираюсь сделать. Хотел бы я найти лучший способ. Этот рефакторинг должен применяться на более чем 10 столах, и каждый из них может иметь сто тонн записей :( – Mojtaba

Смежные вопросы