Использование функции MySQL для определения максимальной записи в таблице - PullRequest
0 голосов
/ 20 марта 2009

Я использую функцию 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 строк, даже если идентификатор соответствует записи.

Что я делаю не так?

1 Ответ

1 голос
/ 20 марта 2009

Я вижу несколько проблем:

Во-первых, слово 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_

Это должно корректно обновить все строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...