2012-02-14 80 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