假设我有一个表TABLE:
NAME ID ...
m -1 ...
f -1 ...
g -1 ...
b -1 ...
z -1 ...
我想把它变成:
NAME ID ...
f 1 ...
g 2 ...
m 3 ...
b -1 ...
z -1 ...
你可能会明白这个想法:
- 从原始表中选择前3行(保留顺序)
- 按NAME列排序选定的行。
- 更新选定的行' ID在新表中的位置(将剩余的未选行保留在原始位置)。
醇>
因此(m, f, g)
已排序为(f, g, m)
且(b, z)
仍为(b, z)
。
以下是我在PHP中尝试的方法:
$count = 0;
$query = "UPDATE TABLE SET ID = $count:= $count + 1 ORDER by NAME DESC LIMIT 3";
mysqli_query($con, $query);
但我不认为我可以继续增加一个计数器并存储它的价值。有什么建议吗?
答案 0 :(得分:0)
你可以试试这个:
$limit = 3;
for($count = 0 ; $count < $limit;$count++ ){
$query = "UPDATE TABLE SET ID = $count + 1 WHERE ID = '-1' ORDER by NAME DESC";
mysqli_query($con, $query);
}
$query = "UPDATE TABLE SET ID = '-1' WHERE ID > $limit ORDER by NAME DESC";
mysqli_query($con, $query);
在上面的逻辑中:
在最后一个循环中,所有ID都设置为$ limit 然而,更新命令outisde循环将ID再次设置为-1
答案 1 :(得分:0)
首先,您可以快速查询表中的前3行并仅获取name属性并在数组中指定值。
$sql = "select name from table order by name limit 3"
$query = $mysqli->query($sql);
现在让我们构建一个辅助数组:
while ($row = $mysqli->fetch_assoc()) {
$a[] = $row['name'];
}
现在只需构建查询:
foreach($a as $id => $name) {
$query = "update table set id={$id+1} where name='$name' limit 1";
// execute the query
}
请注意,我假设名称是唯一的,因此我添加了limit 1
指令,告诉它在找到行后停止查找要更新的行。
另外,不要忘记数组键从0开始计数,因此我们在循环中向$ id添加1。
可能有更优雅的解决方案,但这个很容易理解和使用。
答案 2 :(得分:0)
在MySQL中:
SET @row_number = 0;
update TABLE d
join
(
select
NAME,
@row_number:=@row_number+1 as ID,
from
(select NAME from TABLE limit 3) t
order by
NAME asc
) s on s.NAME = d.NAME
set d.ID = s.ID;
SQLFiddle:http://sqlfiddle.com/#!9/dffecf/1
这假定NAME是您的唯一密钥,否则最好用表中的Identity列替换,并将其用于更新。
此方法可能需要一些语法更改,具体取决于您的数据库引擎。通过在SQL中执行此操作,我们只在DB上进行一次传递。如果您只更新三个记录,但是如果它是1000等等,那么使用PHP迭代多次传递并不是一件大事。