2012-02-14 48 views
0

如果我要选择具有特定列最大值的行,我可以简单地这样做SQL选择以行其最大值时的最大化值从排计算机

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

假设你在pkcol有一个数字主要和你的计算列colname是数字也是,你可以尝试像

SELECT 
    @proc:=CALL procname(colname) AS dummy1, 
    IF(@proc>@val,@id:=pkcol,@id) AS dummy2, 
    IF(@proc>@val,@val:[email protected],@val) AS dummy3 
FROM 
    (@id:=0) AS initid, 
    (@val:=0) AS initval, 
    tablename 
; 

-- discard query result 

SELECT * FROM tablename WHERE [email protected]; 

这将是非常接近你的C结构。

+0

你能给我一个链接来解释'@'和':='语法吗?我不确定我是否明白这一点......是否在原地修改表格? – spraff 2012-02-14 13:06:15

+0

'@ xxx'是一个会话变量 - 将它与PHP中的$ xxx进行比较。 ':='是赋值运算符(就像在Pascal中一样)。请参阅http://dev.mysql.com/doc/refman/5.5/en/user-variables.html – 2012-02-14 13:15:45