【问题标题】:Using a MySQL function to find out the maximum record in a table使用 MySQL 函数找出表中的最大记录
【发布时间】:2009-03-20 15:32:14
【问题描述】:

我正在使用一个 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 forID_` 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'

我的问题是即使 ID 与记录匹配,这也会返回 NULL 行。

我做错了什么?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我可以看到几个问题:

    首先,index这个词是保留的,所以在你的函数中你应该使用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_
    

    这应该会正确更新所有行。

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 2015-06-04
      • 2015-11-05
      • 1970-01-01
      • 2018-09-07
      • 2011-03-16
      • 2011-04-22
      • 1970-01-01
      • 2016-08-24
      相关资源
      最近更新 更多