这个问题应该很简单,但我想不通。在mysql表中,有两列是questionNumber
和rowNumber
。我想通过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/