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.