如何在PHP中执行这个基本的表查询?
假设我有一张桌子:如何在PHP中执行这个基本的表查询?,php,mysqli,Php,Mysqli,假设我有一张桌子: 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 -1 ...
f -1 ...
g -1 ...
b -1 ...
z -1 ...
我想把它变成:
NAME ID ...
f 1 ...
g 2 ...
m 3 ...
b -1 ...
z -1 ...
你可能会想到:
(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);
但我不认为我可以继续增加一个计数器,然后像那样存储它的值。有什么建议吗?您可以尝试以下方法:
$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);
$limit=3;
对于($count=0;$count<$limit;$count++){
$query=“更新表集ID=$count+1,其中ID='-1'按名称排序DESC”;
mysqli_查询($con,$query);
}
$query=“更新表集ID='-1'其中ID>$limit ORDER by NAME DESC”;
mysqli_查询($con,$query);
在上述逻辑中:
在最后一个循环中,所有ID都设置为$limit
然而,update命令outisde循环将再次将IDs设置为-1。首先,您可以快速查询表中的前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
可能有更优雅的解决方案,但这个解决方案很容易理解和使用。在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:
这假定名称是您的唯一键,否则最好用表中的标识列替换,并将其用于更新
这种方法可能需要根据您的DB引擎进行一些语法更改。通过在SQL中执行此操作,我们只在DB中进行一次传递。如果您只更新三条记录,那么使用PHP多次迭代不是什么大问题,但是如果是1000条记录,等等。您总是可以使用select查询来查询前3行,并仅获取名称,因为ID当前不相关。然后使用
sort()
函数对数组进行排序。完成此操作后,调用array\u values()
方法重新设置数组键的基础。现在可以使用循环来构造查询。