我怎么能在PHP中执行这个基本的表查询?

时间:2015-12-31 04:41:57

标签: php mysqli

假设我有一个表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    ...

你可能会明白这个想法:

  
      
  1. 从原始表中选择前3行(保留顺序)
  2.   
  3. 按NAME列排序选定的行。
  4.   
  5. 更新选定的行' ID在新表中的位置(将剩余的未选行保留在原始位置)。
  6.   

因此(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);

但我不认为我可以继续增加一个计数器并存储它的价值。有什么建议吗?

3 个答案:

答案 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迭代多次传递并不是一件大事。