SQL选择从行计算最大值时具有最大值的行

SQL选择从行计算最大值时具有最大值的行,sql,mysql5,Sql,Mysql5,如果我想为特定列选择具有最大值的行,我可以简单地这样做 SELECT * FROM tablename WHERE columnname=(SELECT MAX(columnname) FROM tablename) 我的问题有两方面。首先,如果该值不是一列,而是对该行进行操作的存储过程的结果,那么语法是什么?差不多 SELECT * FROM tablename WHERE CALL procname (???) = (SELECT MAX (CALL procname (???) F

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

SELECT * FROM tablename WHERE columnname=(SELECT MAX(columnname) FROM tablename)
我的问题有两方面。首先,如果该值不是一列,而是对该行进行操作的存储过程的结果,那么语法是什么?差不多

SELECT * FROM tablename
WHERE CALL procname (???)
   = (SELECT MAX (CALL procname (???) FROM tablename)
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;
我如何充实这个问题

其次,在这种简单的形式中,我们在每一行上调用一次
procname
,以确定
MAX(…)
,然后可能在每一行上再次调用,以测试每一行是否具有最大值


我如何优化这一点?我猜它可能和临时桌子有关,但我不知道引擎有多聪明,我在心里把它与一次只需维护一行值的C风格for循环的性能进行比较。

假设您在
pkcol
中有一个数字主循环,并且您的计算列
colname
也是数字的,您可以尝试类似的方法

SELECT * FROM tablename
WHERE CALL procname (???)
   = (SELECT MAX (CALL procname (???) FROM tablename)
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结构。

你能给我一个链接来解释
@
:=
语法吗?我不确定我是否理解这一点。。。它正在修改表吗?
@xxx
是一个会话变量-将它与PHP中的$xxx进行比较。
:=
是赋值运算符(就像在Pascal中一样)。看见