我需要根据表中的 PilotId 更新一列从 1 开始的序号。我从上一个问题得到了答案...但是显然我不能在使用 php 和 mysqli MariaDB 的表达式中使用 CTE 函数或 *。
A) 有人知道为什么我不能使用 CTE 或 *, 吗?
B)有没有办法解决这个问题/迭代每个pilotID的另一种方法是什么?
设置:PlaneID 为 NULL 即可启动。因此,对于 PilotID 的每一行,我需要将 PlaneID 更新为从 1 开始并按顺序更新,这样我的数据就会像这样。该表称为“航班”。
我收到错误。 *,
更新记录时出错:您的 SQL 语法有错误;检查 与您的 MariaDB 服务器版本相对应的手册 在 'from 附近使用的语法 ( select * , NewPlaneId = row_number...' 在第 3 行
数据:
RowID PilotID PlaneID
1 A 1
2 B 1
4 A 2
5 B 2
6 C 1
7 A 3
代码:
$sql'
update a
set PlaneId = NewPlaneId
from (
select *
, NewPlaneId = row_number() over (
partition by PilotId
order by [RowId]
)
from flight
) as a
';
// NOTE: I do substitute in the actual [RowId] ... flight_id
下面的解决方案使用 row_number 函数:
update A
join (
select RowID, row_number() over (partition by PilotID order by RowID) rn from A
) N on N.RowID = A.RowID
SET PlaneID = rn;
结果:
select * from A order by PilotID;
+=======+=========+=========+
| RowID | PilotID | PlaneID |
+=======+=========+=========+
| 1 | A | 1 |
+-------+---------+---------+
| 3 | A | 2 |
+-------+---------+---------+
| 6 | A | 3 |
+-------+---------+---------+
| 2 | B | 1 |
+-------+---------+---------+
| 4 | B | 2 |
+-------+---------+---------+
| 5 | C | 1 |
+-------+---------+---------+