我的表格中有sort_no
列,排序值属于q_id
,对应于问题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 :(得分:1)
update test5
set sort_no=@srt:=if(@grp=q_id,@srt+1,1),
q_id=@grp:=q_id
where (0,0)=(select @grp:=0,@srt:=0)
order by q_id, `name`
设置所需的'order by'。 'order by'中的第一列必须是“q_id”。
注意:在运行此查询之前,应禁用更新安全模式(如果不是默认情况下):
SET SQL_SAFE_UPDATES = 0;
答案 1 :(得分:0)
ORDER BY
不一定只是字段或字段列表。它也可以是任意表达式,例如
ORDER BY foo = 42 DESC, foo
会将所有记录放在42
FIRST,然后将其余记录按常规数字顺序排列。
如果您能够提出一些计算符合您所需排序顺序的值的表达式,那么......
ORDER BY somefunc(...)
也会奏效。重要的是函数返回的值,这是DB用于进行实际排序的值。