从行计算最大化值时,SQL select-row-having-maximum

时间:2012-02-14 12:56:37

标签: sql mysql5

如果我想选择具有特定列的最大值的行,我可以简单地执行此操作

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循环的性能进行比较,它只需要维护一次一行的值。

1 个答案:

答案 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结构非常接近。