更新主键,按其他列排序,重复处理?

时间:2017-08-10 16:59:50

标签: php sql

尝试基本上重新计算主列,即从第一列更新到最后一列,每行增加值。首先我选择,

select
  `someid`,
  `time`
from
  `table`
ORDER BY
  `time` ASC

获取结果,

$data = new SplFixedArray($query->num_rows);
$data = $query->fetch_all();

并更新表格。

for($i=1; $i<count($data); $i++){
   print_r("UPDATING | New someid: " . $i . " WHERE old someid: " . $data[$i][0] . " AND time = " . $data[$i][1] . "<br />");
   $query = $mysqli->query("UPDATE `table` SET `someid` = '" . $i . "' WHERE `time` = '" . $data[$i][1] . "' AND `someid` = '".$data[$i][0]."'");
}

令我困惑的是,前几个条目没有正确排序。它就像

someid  | time
--------------
0       |    0
2       |    1
1       |    2
7       |    3
11      |    4
6       |    5

这是因为重复。在&#34; someid&#34;之后的15行之后有一个差距,它跳到60.所以之后没有更多的重复。但是我如何处理前几行呢?如果我想将someid更新为2但已经存在2?

如果不使用太多的查询来处理它的任何方法?

编辑:

也许某些人不清楚。基本上我试图刷新主列的int值。所以基本上我是在计算它们并在某个时间输入它们的相应数字。有时是日期时间。所以最早的&#34;有时&#34;会得到&#34; someid&#34; = 1。

此刻,某些人有差距。 1..2..3..4..5..6..7..15..16..17..18..30..31..32 正如我现在所做的那样,更新在我达到差距之前不会起作用。因为我试图写一个重复的值。将第一个someid更新为1(可能值为11)不起作用,因为某个地方已存在某个地方。

我会更新某个15到8,因为它是下一个数字。这是有效的,因为缺少8到14,我没有复制值。

一个解决方案可能是创建另一个循环并首先将每个someid更新为某个组合数字,也许从row-&gt; count开始计数,每行递增一次。在那之后,我可以更新它们,因为我正常做。但是没有更好的解决方案吗?

//更新:

此:

SET @count = 0;
UPDATE `table` SET `table`.`someid` = @count:= @count+ 1;

&#34;复位&#34; ID,但它没有按时间排序。

试试这个:

SET @count = 0;
UPDATE `table` SET `table`.`someid` = @count:= @count+ 1;
ORDER BY `time` DESC;

给我以下错误:

重复录入&#39; 1&#39;关键&#39; PRIMARY&#39;

0 个答案:

没有答案