如何在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    ...
你可能会想到:

  • 从原始表中选择前3行(保留顺序)
  • 按“名称”列对选定行进行排序
  • 使用选定行在新表中的位置更新选定行的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);
    
    但我不认为我可以继续增加一个计数器,然后像那样存储它的值。有什么建议吗?

    您可以尝试以下方法:

    $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()
    方法重新设置数组键的基础。现在可以使用循环来构造查询。