gpt4 book ai didi

mysql - 有没有办法按组更新带有行号的 MySQL v5.5 表?

转载 作者:行者123 更新时间:2023-12-04 08:35:07 24 4
gpt4 key购买 nike

我只有 MySQL 5.5 版,所以 ROW_NUMBER() 函数不存在。将此用作测试表:

CREATE TABLE test(recordID INT(3), row_number INT(6), netID INT(6), 
var1 VARCHAR(5), var2 VARCHAR(5)) ;

INSERT INTO test VALUES
(1, 1, 2388, "Bill", "Smith"),
(2, 1, 2388, "Tom", "Smith"),
(3, 1, 2388, "Pat", "Smith"),
(4, 1, 2390, "Fred", "Smith"),
(5, 1, 2390, "John", "Smith"),
(6, 1, 2390, "Hal", "Jone"),
(7, 1, 2399, "Deb", "Jones"),
(8, 1, 2399, "Keith", "Mack");
我编写了以下 SELECT,它在我需要时返回 row_number,但我没有成功将其转换为 UPDATE。
SELECT 
@row_number:=CASE
WHEN @netID_no = netID
THEN @row_number + 1
ELSE 1
END AS row_number, recordID,
@netID_no:= netID netID, var1, var2
FROM
test,
(SELECT @netID_no:=0,@row_number:=0) as t
WHERE netID <> 0
ORDER BY
netID ASC, recordID;
我试图像这样选择一个 MySQL 变量;
SET @mycode:=( SELECT … etc );
UPDATE NetLog SET row_number = (@mycode) WHERE netID = @netID_no;
但是我收到了各种模棱两可的语法错误。
我不知道如何从这里开始,请给我一个例子吗?

最佳答案

您不能使用用户定义的变量插入子查询。变量仅代替标量值,而不是表达式或子查询或标识符或其他任何东西。仅使用一个变量,否则您将使用单个字符串或数字文字。
这是一个解决方案:

SET @netid=0, @row_number=0;

UPDATE test
SET row_number = CASE netID
WHEN @netID THEN @row_number:=@row_number+1
ELSE ((@netID:=netID)-@netID) + (@row_number:=1)
END
ORDER BY netID, recordID;
结果:
+----------+------------+-------+-------+-------+
| recordID | row_number | netID | var1 | var2 |
+----------+------------+-------+-------+-------+
| 1 | 1 | 2388 | Bill | Smith |
| 2 | 2 | 2388 | Tom | Smith |
| 3 | 3 | 2388 | Pat | Smith |
| 4 | 1 | 2390 | Fred | Smith |
| 5 | 2 | 2390 | John | Smith |
| 6 | 3 | 2390 | Hal | Jone |
| 7 | 1 | 2399 | Deb | Jones |
| 8 | 2 | 2399 | Keith | Mack |
+----------+------------+-------+-------+-------+
我在 ((@netID:=netID)-@netID) 中使用了一个技巧因为这分配了 @netID使用当前行的 netID 中的值柱子。然后减去相同的值,因此表达式产生零。
这是你不得不诉诸的那种笨拙的把戏。当您可以升级到 MySQL 8.0 并使用窗口函数时,您会更高兴。

关于mysql - 有没有办法按组更新带有行号的 MySQL v5.5 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64837806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com