这个问题应该很简单,但我想不通。在mysql表中,有两列是questionNumberrowNumber。我想通过rowNumber更新questionNumber顺序。这是我的php,问题出在query("UPDATE Question SET rowNumber = ($x=$x+1) ORDER BY QuestionNumber")中。有人帮我修吗?

<?php

    $link = mysqli_connect($dbhost, $username, $dbpass, $database);

    if (!$link) {
        echo "Error: Unable to connect to MySQL." . PHP_EOL;
        echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
        echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
        exit;
    }

    $x = 0;
    $sql = "UPDATE Question SET rowNumber = ($x=$x+1) ORDER BY QuestionNumber";

    if ($link->query($sql) === TRUE) {
        echo "Updated";
    } else {
        echo "Error updating record: " . $link->error;
    }
    $link->close();
    ?>

最佳答案

这是一个我刚刚放在一起的视觉。想象一张有城市和州的桌子,还有一个rownum列!
我想更新rownum列,但仅限于state=South Carolina的行。。。联合国安全理事会
我希望更新顺序是按城市名称。数据最初是按物理顺序插入的,以显示其工作原理,即SC城市名称最初不是按字母顺序插入的。
架构:

drop table if exists locat123;
create table locat123
(   id int auto_increment primary key,
    city varchar(100) not null,
    state varchar(100) not null,
    rownum int not null
);
insert locat123 (city,state,rownum) values
('a1','NY',-1),('a2','NY',-1),('a3','NY',-1),('a4','NY',-1),
('m1','MT',-1),('m2','MT',-1),
('s8','SC',-1),('s2','SC',-1),('s4','SC',-1),('s1','SC',-1),('s11','SC',-1);

带有派生表的Update语句:
update locat123 l
join
(   select l.id,l.city,@rn:=@rn+1 as rown
    from locat123 l
    cross join (select @rn:=0) params
    where l.state='SC' -- <==================== right there, update SC only
    order by l.city -- By the way, 5 rows that are South Carolina (SC) in here
) xDerived
on l.id=xDerived.id
set l.rownum=xDerived.rown;
-- 5 rows updated

结果:
select * from locat123 order by state,city;

+----+------+-------+--------+
| id | city | state | rownum |
+----+------+-------+--------+
|  5 | m1   | MT    |     -1 |
|  6 | m2   | MT    |     -1 |
|  1 | a1   | NY    |     -1 |
|  2 | a2   | NY    |     -1 |
|  3 | a3   | NY    |     -1 |
|  4 | a4   | NY    |     -1 |
| 10 | s1   | SC    |      1 |
| 11 | s11  | SC    |      2 |
|  8 | s2   | SC    |      3 |
|  9 | s4   | SC    |      4 |
|  7 | s8   | SC    |      5 |
+----+------+-------+--------+

那么为什么要导出表呢?因为我们必须引入一个变量作为计数器。我们使用cross join的唯一目的就是把这个变量放到整个过程中。在解析导出的表之后,我们将其结果折叠成包装它的normalUpdate with a Join模式。
当然,正如用户FirstOne所说,我们可以在某些情况下使用Update ... order by。上面是我为这一个想到的。
哦,再说一遍,派生表通常用于清理我们定制的信息并将其折叠到查询的大部分。

关于php - 如何更新rowNumber,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38194118/

10-12 16:51