2012-04-09 93 views
0

下面是一個查詢我試着寫:你可以在SELECT中分配一個變量,然後在同一個SELECT中使用它嗎?

SELECT I.*, 
     IF(MAX(B.`amount`) != 0, MAX(B.`amount`), I.`start`) AS `current_bid`, 
     `current_bid` * 1.05 AS `min_bid` 
     ... 

我收到錯誤「未知列‘CURRENT_BID’」。我假設這是因爲我剛纔在行中創建了當前列。無論如何,我可以使這個查詢以我想要的方式工作嗎?我想一個辦法來得到它的工作是使用兩個if語句是說基本上是一回事,就像這樣:

SELECT I.*, 
     IF(MAX(B.`amount`) != 0, MAX(B.`amount`), I.`start`) AS `current_bid`, 
     IF(MAX(B.`amount`) != 0, MAX(B.`amount`) * 1.05, I.`start` * 1.05) AS `min_id` 
     ... 

但似乎效率極其低下。

另外,有沒有一種方法可以分配current而無需計算MAX(B.amount)兩次?

回答

2
SELECT 
    C.CURRENT_BID, 
    C.CURRENT_BID * 1.05 AS MIN_BID 
FROM 
    (
     SELECT MAX(B.AMOUNT) AS CURRENT_BID FROM ... 
    ) C 

我很確定嵌套查詢先被執行,以便您可以使用它們的結果。而同一查詢中的不同列被視爲併發,因此您不能使它們彼此依賴。

+0

你打敗了我......我認爲這是唯一的方法。雖然這似乎很奇怪,但爲什麼SQL沒有內置的方式來替換列。 – McGarnagle 2012-04-09 05:50:20

0

您不能在另一列中引用current_bid或任何別名列。有兩種方式進行:

  1. 您複製整個計算每當你想使用該值(最有效,更可讀)
  2. 您使用派生表(效率較低,更具可讀性)

在你應該這樣做後一種情況:

select current_bid from (
    IF(MAX(B.`amount`) != 0, MAX(B.`amount`), I.`start`) AS `current_bid`... 
) s 

我想強調做的派生表將執行所有行的掃描,並且會少高效。大多數情況下,最好複製公式。

PS:如果你打算在第一個選項,請注意,你可以寫你的第二個IF這樣:

IF(MAX(B.`amount`) = 0, I.`start`, MAX(B.`amount`)) * 1.05 `min_id` 

哪個更可讀一點。

相關問題