如果我想选择具有特定列的最大值的行,我可以简单地执行此操作
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风格的for循环的性能进行比较,它只需要维护一次一行的值。
答案 0 :(得分:0)
假设您在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结构非常接近。