根据排序列和另一个列值重新排序表

时间:2016-08-24 19:28:28

标签: php mysql sorting refactoring

我的表格中有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中执行此操作。

我不知道查询。

以前有人经历过这个吗?

2 个答案:

答案 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用于进行实际排序的值。