使用不带 CTE 或 * 的行号更新表格列,

问题描述 投票:0回答:1

我需要根据表中的 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
mysql mariadb
1个回答
1
投票

下面的解决方案使用 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;

MariaDB 小提琴

结果:

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       |
+-------+---------+---------+
© www.soinside.com 2019 - 2024. All rights reserved.