0

如果我想为特定列选择具有最大值的行,我可以简单地这样做

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 循环的性能进行比较一次一行的值。

4

1 回答 1

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 构造。

于 2012-02-14T13:03:06.027 回答