如果我想为特定列选择具有最大值的行,我可以简单地执行
SELECT * FROM tablename WHERE columnname=(SELECT MAX(columnname) FROM tablename)
我的问题有两方面。首先,如果这个值不是列,而是对行进行操作的存储过程的结果,语法是什么?类似的东西
SELECT * FROM tablename
WHERE CALL procname (???)
= (SELECT MAX (CALL procname (???) FROM tablename)
如何充实此查询?
其次,在这种天真的形式中,我们对每行调用procname
一次以确定MAX(...)
,然后可能对每行再次调用一次以测试每行是否具有最大值。
如何优化?我猜这可能与临时表有关,但我不知道这个引擎有多聪明,我在心里把它与C风格的循环的性能进行比较,因为循环一次只需要保持一行的值。
假设您在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结构。