SQL select-row-имея-максимум, когда максимизирующее значение вычисляется из строки

Если я хочу выбрать строку, которая имеет максимальное значение для определенного столбца, я могу просто сделать это

SELECT * FROM tablename WHERE columnname=(SELECT MAX(columnname) FROM tablename)

Моя проблема двоякая. Во-первых, если это значение не столбец, а результат хранимой процедуры, работающей со строкой, каков синтаксис? Что-то вроде

SELECT * FROM tablename
WHERE CALL procname (???)
   = (SELECT MAX (CALL procname (???) FROM tablename)

Как мне конкретизировать этот запрос?

Во-вторых, в этой наивной форме мы называем procname один раз в каждом ряду, чтобы определить MAX(...) и затем потенциально еще раз в каждой строке, чтобы проверить, имеет ли каждая строка максимальное значение.

Как я могу оптимизировать это? Я предполагаю, что это может быть связано с временной таблицей, но я не знаю, насколько умный двигатель, я мысленно сравниваю это с производительностью цикла for в стиле C, который должен был бы только поддерживать значения по одной строке за раз.

1 ответ

Предполагая, что у вас есть числовой первичный в pkcol и ваш расчетный столбец colname также числовой, вы можете попробовать что-то вроде

SELECT
  @proc:=CALL procname(colname) AS dummy1,
  IF(@proc>@val,@id:=pkcol,@id) AS dummy2,
  IF(@proc>@val,@val:=@val,@val) AS dummy3
FROM
  (@id:=0) AS initid,
  (@val:=0) AS initval,
  tablename
;

-- discard query result

SELECT * FROM tablename WHERE pkcol=@id;

Что было бы очень близко к вашей конструкции C.

Другие вопросы по тегам