我正在使用 MySQL 函数来查找下表中的最大记录。
SQL 数据:
id_ index Value1 Value2 Value 3 Max_idVal
1 'abc' 5 10 5 5
1 'abc' 0 12 4 5
1 'abc' 0 13 3 5
2 'abc' 4 9 10 8
2 'abc' 8 10 8 8
Max_idVal
是MySQL函数返回的结果。这个想法是遍历每一行并将最大值放入 Max_idVal
中。该行的字段。
这里是ID_
1、Value1
是“5”处的最大值。它被分配给 Max_idVal'. This works the same way for
ID_` 2 和其余行。
SQL 函数:
DELIMITER $$
CREATE FUNCTION `fn_get_max` (
_id INT,
_index VARCHAR( 30 )
) RETURNS INT( 11 ) READS SQL DATA BEGIN DECLARE r INT;
SELECT Max(value1 )
INTO r
FROM Table_name
WHERE id = _id
AND index = _index;
RETURN r;
END $$
SQL 查询:
UPDATE table_name SET max_idval = fn_get_max('1','abc') WHERE id = '1'
我的问题是这会返回 NULL
行,即使 ID 与记录匹配。
我做错了什么?
最佳答案
我发现有几个问题:
首先,索引这个词是保留的,所以在你的函数中你应该使用index
。
其次,在提供的更新语句中,您的 WHERE 子句应该是 id_ = 1
,而不是 id = 1
。我使用以下代码重新创建了您的表和函数:
DELIMITER $$
DROP FUNCTION IF EXISTS `test`.`fn_get_max`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `fn_get_max2`( _id INT,
_index VARCHAR( 30 )) RETURNS INT(11)
BEGIN
DECLARE r INT;
SELECT MAX(value1 )
INTO r
FROM test_table
WHERE id_ = _id
AND `INDEX` = _index;
RETURN r;
END$$
DELIMITER ;
然后使用以下更新语句正确更新 max_idval。
UPDATE test_table SET max_idval = fn_get_max2('1','abc') WHERE id_ = '1'
如果这只是一次性更新,您可以使用临时表更有效地完成此操作(因为 MySQL 不允许表在更新查询中连接到自身):
CREATE TEMPORARY TABLE tmp (id_ INT, maxvalue1 INT);
INSERT INTO tmp (id_, maxvalue1)
SELECT id_, MAX(Value1) AS max_value1
FROM test_table
GROUP BY id_;
UPDATE test_table, tmp SET test_table.Max_idVal = tmp.maxvalue1
WHERE test_table.id_ = tmp.id_
这应该正确更新所有行。
关于mysql - 使用MySQL函数找出表中的最大记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/666651/