在更新中按顺序编号记录

时间:2021-03-27 09:32:45

标签: sql count sql-update mariadb

我有以下运行良好的 SQL 查询

UPDATE tnTOPIC A1
INNER JOIN (SELECT
                fnTOPIC_IDX fnIDX,
                COUNT(1) fnCOUNT
                FROM tnURL
                WHERE fnGOTIMAGE = 0
                GROUP BY fnTOPIC_IDX) A2
                ON (A1.fnIDX = A2.fnIDX
              )
SET A1.fnRECORDS_REMAINING = A2.fnCOUNT

我想用输出的顺序更新 tnTOPIC (fnROW_NUMBER) 中的一个附加字段。

所以记录一为 1,记录二为 2,依此类推。

我使用 MariaDB。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以在加入表的子查询中使用 ROW_NUMBER() 窗口函数:

UPDATE tnTOPIC t
INNER JOIN (
  SELECT t.fnIDX, u.fnCOUNT,
         ROW_NUMBER() OVER (ORDER BY t.fnIDX) rn
  FROM tnTOPIC t
  INNER JOIN (
    SELECT fnTOPIC_IDX fnIDX, COUNT(1) fnCOUNT
    FROM tnURL
    WHERE fnGOTIMAGE = 0
    GROUP BY fnTOPIC_IDX
  ) u ON u.fnIDX = t.fnIDX 
) s ON s.fnIDX = t.fnIDX
SET t.fnRECORDS_REMAINING = s.fnCOUNT,
    t.fnROW_NUMBER = s.rn

如果您确定子查询的所有 fnTOPIC_IDX 将匹配 fnIDXtnTOPIC,您可以将代码简化为:

UPDATE tnTOPIC t
INNER JOIN (
  SELECT fnTOPIC_IDX fnIDX, COUNT(1) fnCOUNT,
         ROW_NUMBER() OVER (ORDER BY fnTOPIC_IDX) rn
  FROM tnURL
  WHERE fnGOTIMAGE = 0
  GROUP BY fnTOPIC_IDX
) u ON u.fnIDX = t.fnIDX
SET t.fnRECORDS_REMAINING = u.fnCOUNT,
    t.fnROW_NUMBER = u.rn

我在 fnIDXORDER BY 子句中使用了 ROW_NUMBER()
如果您想要序列的另一个顺序,您可以更改它。