mysql - 使用MySQL函数找出表中的最大记录

标签 mysql

我正在使用 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/

相关文章:

c# - 在 C# 中使用 MySQL

PHP,如何检查MySQL表是否有名称

mysql存储函数: how to select multiple results and process them

php - 用于向多个客户部署 PHP MySQL 应用程序的重复表

php - 如何防止 PHP 中的 SQL 注入(inject)?

MySQL,如何从第一个表中选择一行,从第二个表中选择两行

mysql - 将查询从 NOT IN 更改为 NOt EXISTS

mysql - 组合框并从数据网格显示

mysql - install_driver(mysql) 失败 : Can't locate DBD/mysql. pm

PHP HTML MYSQL 在用户输入注册详细信息后尝试更新数据库的特定行